projects/guix·blob python-team · refs

4086 lines · 130.2 KiB

1Upstream status: https://github.com/D-Programming-GDC/gcc/pull/25
2
3Backport of
4 https://github.com/dlang/dmd/pull/22829
5 https://github.com/dlang/phobos/pull/10980
6
7to gdc-14
8
9with additional gdc specific changes.
10Also regenerates the autotools.
11
12From e8c3f2cfad1a69cd3fa5445a0d61d2f59d73a5d1 Mon Sep 17 00:00:00 2001
13From: Yelninei <[email protected]>
14Date: Sat, 11 Apr 2026 19:42:55 +0000
15Subject: [PATCH 1/4] phobos: Port to GNU/Hurd
16
17---
18 libphobos/src/std/datetime/timezone.d | 1 +
19 libphobos/src/std/math/algebraic.d | 1 +
20 libphobos/src/std/process.d | 2 ++
21 3 files changed, 4 insertions(+)
22
23diff --git a/libphobos/src/std/datetime/timezone.d b/libphobos/src/std/datetime/timezone.d
24index b23891808..e68f2e828 100644
25--- a/libphobos/src/std/datetime/timezone.d
26+++ b/libphobos/src/std/datetime/timezone.d
27@@ -338,6 +338,7 @@ public:
28 else version (linux) enum utcZone = "UTC";
29 else version (Darwin) enum utcZone = "UTC";
30 else version (Solaris) enum utcZone = "UTC";
31+ else version (Hurd) enum utcZone = "UTC";
32 else static assert(0, "The location of the UTC timezone file on this Posix platform must be set.");
33
34 auto tzs = [testTZ("America/Los_Angeles", "PST", "PDT", dur!"hours"(-8), dur!"hours"(1)),
35diff --git a/libphobos/src/std/math/algebraic.d b/libphobos/src/std/math/algebraic.d
36index fd305231d..c909148ea 100644
37--- a/libphobos/src/std/math/algebraic.d
38+++ b/libphobos/src/std/math/algebraic.d
39@@ -611,6 +611,7 @@ else version (FreeBSD) version = GenericPosixVersion;
40 else version (OpenBSD) version = GenericPosixVersion;
41 else version (Solaris) version = GenericPosixVersion;
42 else version (DragonFlyBSD) version = GenericPosixVersion;
43+else version (Hurd) version = GenericPosixVersion;
44
45 private real polyImpl(real x, in real[] A) @trusted pure nothrow @nogc
46 {
47diff --git a/libphobos/src/std/process.d b/libphobos/src/std/process.d
48index 3b8922179..b245936da 100644
49--- a/libphobos/src/std/process.d
50+++ b/libphobos/src/std/process.d
51@@ -1039,6 +1039,8 @@ private Pid spawnProcessPosix(scope const(char[])[] args,
52 import core.sys.freebsd.unistd : closefrom;
53 else version (OpenBSD)
54 import core.sys.openbsd.unistd : closefrom;
55+ else version (Hurd)
56+ import core.sys.hurd.unistd : closefrom;
57
58 static if (!__traits(compiles, closefrom))
59 {
60--
612.52.0
62
63From 0549a921b9309f860f0a038427a7fc6526fcde4d Mon Sep 17 00:00:00 2001
64From: Yelninei <[email protected]>
65Date: Sat, 11 Apr 2026 20:09:59 +0000
66Subject: [PATCH 2/4] druntime: Backport support for GNU/Hurd
67
68---
69 libphobos/libdruntime/core/demangle.d | 1 +
70 libphobos/libdruntime/core/stdc/config.d | 2 +
71 libphobos/libdruntime/core/stdc/errno.d | 107 +++
72 libphobos/libdruntime/core/stdc/limits.d | 14 +
73 libphobos/libdruntime/core/sys/hurd/config.d | 30 +
74 libphobos/libdruntime/core/sys/hurd/dlfcn.d | 114 +++
75 libphobos/libdruntime/core/sys/hurd/elf.d | 162 +++++
76 libphobos/libdruntime/core/sys/hurd/errno.d | 21 +
77 .../libdruntime/core/sys/hurd/execinfo.d | 16 +
78 libphobos/libdruntime/core/sys/hurd/link.d | 134 ++++
79 .../libdruntime/core/sys/hurd/sys/types.d | 22 +
80 libphobos/libdruntime/core/sys/hurd/time.d | 15 +
81 libphobos/libdruntime/core/sys/hurd/unistd.d | 30 +
82 libphobos/libdruntime/core/sys/linux/stdio.d | 1 +
83 libphobos/libdruntime/core/sys/posix/dirent.d | 11 +
84 libphobos/libdruntime/core/sys/posix/fcntl.d | 107 +++
85 .../libdruntime/core/sys/posix/netinet/in_.d | 58 +-
86 libphobos/libdruntime/core/sys/posix/poll.d | 16 +
87 .../libdruntime/core/sys/posix/pthread.d | 218 ++++--
88 libphobos/libdruntime/core/sys/posix/sched.d | 11 +
89 .../libdruntime/core/sys/posix/semaphore.d | 32 +-
90 libphobos/libdruntime/core/sys/posix/signal.d | 189 ++++-
91 libphobos/libdruntime/core/sys/posix/spawn.d | 42 ++
92 .../libdruntime/core/sys/posix/sys/ioctl.d | 37 +
93 .../libdruntime/core/sys/posix/sys/ipc.d | 43 ++
94 .../libdruntime/core/sys/posix/sys/mman.d | 33 +
95 .../libdruntime/core/sys/posix/sys/msg.d | 44 ++
96 .../libdruntime/core/sys/posix/sys/resource.d | 58 ++
97 .../libdruntime/core/sys/posix/sys/shm.d | 26 +
98 .../libdruntime/core/sys/posix/sys/socket.d | 161 +++++
99 .../libdruntime/core/sys/posix/sys/stat.d | 72 ++
100 .../libdruntime/core/sys/posix/sys/statvfs.d | 152 ++--
101 .../libdruntime/core/sys/posix/sys/types.d | 669 +++++++++++-------
102 libphobos/libdruntime/core/sys/posix/sys/un.d | 9 +
103 .../libdruntime/core/sys/posix/sys/utsname.d | 39 +-
104 .../libdruntime/core/sys/posix/sys/wait.d | 23 +
105 .../libdruntime/core/sys/posix/termios.d | 97 +++
106 libphobos/libdruntime/core/sys/posix/time.d | 12 +
107 libphobos/libdruntime/core/thread/osthread.d | 8 +
108 libphobos/libdruntime/core/time.d | 25 +
109 libphobos/libdruntime/gcc/backtrace.d | 2 +
110 libphobos/libdruntime/gcc/sections/elf.d | 9 +
111 42 files changed, 2474 insertions(+), 398 deletions(-)
112 create mode 100644 libphobos/libdruntime/core/sys/hurd/config.d
113 create mode 100644 libphobos/libdruntime/core/sys/hurd/dlfcn.d
114 create mode 100644 libphobos/libdruntime/core/sys/hurd/elf.d
115 create mode 100644 libphobos/libdruntime/core/sys/hurd/errno.d
116 create mode 100644 libphobos/libdruntime/core/sys/hurd/execinfo.d
117 create mode 100644 libphobos/libdruntime/core/sys/hurd/link.d
118 create mode 100644 libphobos/libdruntime/core/sys/hurd/sys/types.d
119 create mode 100644 libphobos/libdruntime/core/sys/hurd/time.d
120 create mode 100644 libphobos/libdruntime/core/sys/hurd/unistd.d
121
122diff --git a/libphobos/libdruntime/core/demangle.d b/libphobos/libdruntime/core/demangle.d
123index 272ee1e1b..522991dd7 100644
124--- a/libphobos/libdruntime/core/demangle.d
125+++ b/libphobos/libdruntime/core/demangle.d
126@@ -3045,6 +3045,7 @@ CXX_DEMANGLER getCXXDemangler() nothrow @trusted
127 version (OpenBSD) import core.sys.openbsd.dlfcn : RTLD_DEFAULT;
128 version (Darwin) import core.sys.darwin.dlfcn : RTLD_DEFAULT;
129 version (Solaris) import core.sys.solaris.dlfcn : RTLD_DEFAULT;
130+ version (Hurd) import core.sys.hurd.dlfcn : RTLD_DEFAULT;
131
132 if (auto found = cast(CXX_DEMANGLER) dlsym(RTLD_DEFAULT, "__cxa_demangle"))
133 atomicStore(__cxa_demangle, found);
134diff --git a/libphobos/libdruntime/core/stdc/config.d b/libphobos/libdruntime/core/stdc/config.d
135index ca833eaac..c5ad3a87e 100644
136--- a/libphobos/libdruntime/core/stdc/config.d
137+++ b/libphobos/libdruntime/core/stdc/config.d
138@@ -262,6 +262,8 @@ else version (DigitalMars)
139 alias real c_long_double;
140 else version (Darwin)
141 alias real c_long_double;
142+ else version (Hurd)
143+ alias real c_long_double;
144 }
145 }
146
147diff --git a/libphobos/libdruntime/core/stdc/errno.d b/libphobos/libdruntime/core/stdc/errno.d
148index ddec70f7a..21c4dff97 100644
149--- a/libphobos/libdruntime/core/stdc/errno.d
150+++ b/libphobos/libdruntime/core/stdc/errno.d
151@@ -2551,6 +2551,113 @@ else version (WASI)
152 enum ERFKILL = 132;
153 enum EHWPOISON = 133;
154 }
155+else version (Hurd)
156+{
157+ enum EPERM = 0x40000001; /* Operation not permitted */
158+ enum ENOENT = 0x40000002; /* No such file or directory */
159+ enum ESRCH = 0x40000003; /* No such process */
160+ enum EINTR = 0x40000004; /* Interrupted system call */
161+ enum EIO = 0x40000005; /* Input/output error */
162+ enum ENXIO = 0x40000006; /* No such device or address */
163+ enum E2BIG = 0x40000007; /* Argument list too long */
164+ enum ENOEXEC = 0x40000008; /*enum Exec format error */
165+ enum EBADF = 0x40000009; /* Bad file descriptor */
166+ enum ECHILD = 0x4000000a; /* No child processes */
167+ enum EDEADLK = 0x4000000b; /* Resource deadlock avoided */
168+ enum ENOMEM = 0x4000000c; /* Cannot allocate memory */
169+ enum EACCES = 0x4000000d; /* Permission denied */
170+ enum EFAULT = 0x4000000e; /* Bad address */
171+ enum ENOTBLK = 0x4000000f; /* Block device required */
172+ enum EBUSY = 0x40000010; /* Device or resource busy */
173+ enum EEXIST = 0x40000011; /* File exists */
174+ enum EXDEV = 0x40000012; /* Invalid cross-device link */
175+ enum ENODEV = 0x40000013; /* No such device */
176+ enum ENOTDIR = 0x40000014; /* Not a directory */
177+ enum EISDIR = 0x40000015; /* Is a directory */
178+ enum EINVAL = 0x40000016; /* Invalid argument */
179+ enum EMFILE = 0x40000018; /* Too many open files */
180+ enum ENFILE = 0x40000017; /* Too many open files in system */
181+ enum ENOTTY = 0x40000019; /* Inappropriate ioctl for device */
182+ enum ETXTBSY = 0x4000001a; /* Text file busy */
183+ enum EFBIG = 0x4000001b; /* File too large */
184+ enum ENOSPC = 0x4000001c; /* No space left on device */
185+ enum ESPIPE = 0x4000001d; /* Illegal seek */
186+ enum EROFS = 0x4000001e; /* Read-only file system */
187+ enum EMLINK = 0x4000001f; /* Too many links */
188+ enum EPIPE = 0x40000020; /* Broken pipe */
189+ enum EDOM = 0x40000021; /* Numerical argument out of domain */
190+ enum ERANGE = 0x40000022; /* Numerical result out of range */
191+ enum EAGAIN = 0x40000023; /* Resource temporarily unavailable */
192+ enum EINPROGRESS = 0x40000024; /* Operation now in progress */
193+ enum EALREADY = 0x40000025; /* Operation already in progress */
194+ enum ENOTSOCK = 0x40000026; /* Socket operation on non-socket */
195+ enum EMSGSIZE = 0x40000028; /* Message too long */
196+ enum EPROTOTYPE = 0x40000029; /* Protocol wrong type for socket */
197+ enum ENOPROTOOPT = 0x4000002a; /* Protocol not available */
198+ enum EPROTONOSUPPORT = 0x4000002b; /* Protocol not supported */
199+ enum ESOCKTNOSUPPORT = 0x4000002c; /* Socket type not supported */
200+ enum EOPNOTSUPP = 0x4000002d; /* Operation not supported */
201+ enum EPFNOSUPPORT = 0x4000002e; /* Protocol family not supported */
202+ enum EAFNOSUPPORT = 0x4000002f; /* Address family not supported by protocol */
203+ enum EADDRINUSE = 0x40000030; /* Address already in use */
204+ enum EADDRNOTAVAIL = 0x40000031; /* Cannot assign requested address */
205+ enum ENETDOWN = 0x40000032; /* Network is down */
206+ enum ENETUNREACH = 0x40000033; /* Network is unreachable */
207+ enum ENETRESET = 0x40000034; /* Network dropped connection on reset */
208+ enum ECONNABORTED = 0x40000035; /* Software caused connection abort */
209+ enum ECONNRESET = 0x40000036; /* Connection reset by peer */
210+ enum ENOBUFS = 0x40000037; /* No buffer space available */
211+ enum EISCONN = 0x40000038; /* Transport endpoint is already connected */
212+ enum ENOTCONN = 0x40000039; /* Transport endpoint is not connected */
213+ enum EDESTADDRREQ = 0x40000027; /* Destination address required */
214+ enum ESHUTDOWN = 0x4000003a; /* Cannot send after transport endpoint shutdown */
215+ enum ETOOMANYREFS = 0x4000003b; /* Too many references: cannot splice */
216+ enum ETIMEDOUT = 0x4000003c; /* Connection timed out */
217+ enum ECONNREFUSED = 0x4000003d; /* Connection refused */
218+ enum ELOOP = 0x4000003e; /* Too many levels of symbolic links */
219+ enum ENAMETOOLONG = 0x4000003f; /* File name too long */
220+ enum EHOSTDOWN = 0x40000040; /* Host is down */
221+ enum EHOSTUNREACH = 0x40000041; /* No route to host */
222+ enum ENOTEMPTY = 0x40000042; /* Directory not empty */
223+ enum EPROCLIM = 0x40000043; /* Too many processes */
224+ enum EUSERS = 0x40000044; /* Too many users */
225+ enum EDQUOT = 0x40000045; /* Disk quota exceeded */
226+ enum ESTALE = 0x40000046; /* Stale file handle */
227+ enum EREMOTE = 0x40000047; /* Object is remote */
228+ enum EBADRPC = 0x40000048; /* RPC struct is bad */
229+ enum ERPCMISMATCH = 0x40000049; /* RPC version wrong */
230+ enum EPROGUNAVAIL = 0x4000004a; /* RPC program not available */
231+ enum EPROGMISMATCH = 0x4000004b; /* RPC program version wrong */
232+ enum EPROCUNAVAIL = 0x4000004c; /* RPC bad procedure for program */
233+ enum ENOLCK = 0x4000004d; /* No locks available */
234+ enum EFTYPE = 0x4000004f; /* Inappropriate file type or format */
235+ enum EAUTH = 0x40000050; /* Authentication error */
236+ enum ENEEDAUTH = 0x40000051; /* Need authenticator */
237+ enum ENOSYS = 0x4000004e; /* Function not implemented */
238+ enum ELIBEXEC = 0x40000053; /* Cannot exec a shared library directly */
239+ enum ENOTSUP = 0x40000076; /* Not supported */
240+ enum EILSEQ = 0x4000006a; /* Invalid or incomplete multibyte or wide character */
241+ enum EBACKGROUND = 0x40000064; /* Inappropriate operation for background process */
242+ enum EDIED = 0x40000065; /* Translator died */
243+ enum ED = 0x40000066; /* ? */
244+ enum EGREGIOUS = 0x40000067; /* You really blew it this time */
245+ enum EIEIO = 0x40000068; /* Computer bought the farm */
246+ enum EGRATUITOUS = 0x40000069; /* Gratuitous error */
247+ enum EBADMSG = 0x4000006b; /* Bad message */
248+ enum EIDRM = 0x4000006c; /* Identifier removed */
249+ enum EMULTIHOP = 0x4000006d; /* Multihop attempted */
250+ enum ENODATA = 0x4000006e; /* No data available */
251+ enum ENOLINK = 0x4000006f; /* Link has been severed */
252+ enum ENOMSG = 0x40000070; /* No message of desired type */
253+ enum ENOSR = 0x40000071; /* Out of streams resources */
254+ enum ENOSTR = 0x40000072; /* Device not a stream */
255+ enum EOVERFLOW = 0x40000073; /* Value too large for defined data type */
256+ enum EPROTO = 0x40000074; /* Protocol error */
257+ enum ETIME = 0x40000075; /* Timer expired */
258+ enum ECANCELED = 0x40000077; /* Operation canceled */
259+ enum EOWNERDEAD = 0x40000078; /* Owner died */
260+ enum ENOTRECOVERABLE = 0x40000079; /* State not recoverable */
261+ }
262 else
263 {
264 static assert(false, "Unsupported platform");
265diff --git a/libphobos/libdruntime/core/stdc/limits.d b/libphobos/libdruntime/core/stdc/limits.d
266index f3f88006a..e67b0cb22 100644
267--- a/libphobos/libdruntime/core/stdc/limits.d
268+++ b/libphobos/libdruntime/core/stdc/limits.d
269@@ -182,3 +182,17 @@ else version (Windows)
270 ///
271 enum PIPE_BUF = 5120;
272 }
273+else version (Hurd)
274+{
275+ // no arbitrary fixed limits
276+ ///
277+ // enum MAX_CANON
278+ ///
279+ // enum MAX_INPUT
280+ ///
281+ enum NAME_MAX = 255;
282+ ///
283+ // enum PATH_MAX
284+ ///
285+ // enum PIPE_BUF
286+}
287diff --git a/libphobos/libdruntime/core/sys/hurd/config.d b/libphobos/libdruntime/core/sys/hurd/config.d
288new file mode 100644
289index 000000000..109990d54
290--- /dev/null
291+++ b/libphobos/libdruntime/core/sys/hurd/config.d
292@@ -0,0 +1,30 @@
293+/**
294+ * D header file for GNU/Hurd.
295+ *
296+ * Copyright: Copyright (c) 2026 D Language Foundation
297+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
298+ */
299+module core.sys.hurd.config;
300+
301+version (Hurd):
302+
303+public import core.sys.posix.config;
304+
305+// man 7 feature_test_macros
306+// http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
307+enum _GNU_SOURCE = true;
308+// deduced <features.h>
309+// http://sourceware.org/git/?p=glibc.git;a=blob;f=include/features.h
310+enum _DEFAULT_SOURCE = true;
311+enum _ATFILE_SOURCE = true;
312+
313+// _BSD_SOURCE and _SVID_SOURCE are deprecated aliases for _DEFAULT_SOURCE.
314+deprecated("use _DEFAULT_SOURCE")
315+{
316+ enum _BSD_SOURCE = true;
317+ enum _SVID_SOURCE = true;
318+}
319+
320+enum __USE_MISC = _DEFAULT_SOURCE;
321+enum __USE_ATFILE = _ATFILE_SOURCE;
322+enum __USE_GNU = _GNU_SOURCE;
323diff --git a/libphobos/libdruntime/core/sys/hurd/dlfcn.d b/libphobos/libdruntime/core/sys/hurd/dlfcn.d
324new file mode 100644
325index 000000000..430857621
326--- /dev/null
327+++ b/libphobos/libdruntime/core/sys/hurd/dlfcn.d
328@@ -0,0 +1,114 @@
329+/**
330+ * D header file for GNU/Hurd.
331+ *
332+ * Copyright: Copyright (c) 2026 D Language Foundation
333+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
334+ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=dlfcn/dlfcn.h, glibc dlfcn/dlfcn.h)
335+ */
336+module core.sys.hurd.dlfcn;
337+
338+version (Hurd):
339+extern (C):
340+nothrow:
341+@nogc:
342+@system:
343+
344+
345+public import core.sys.posix.dlfcn;
346+import core.sys.hurd.config;
347+
348+// <bits/dlfcn.h>
349+
350+// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
351+// enum RTLD_LAZY = 0x00001; // POSIX
352+// enum RTLD_NOW = 0x00002; // POSIX
353+enum RTLD_BINDING_MASK = 0x3;
354+enum RTLD_NOLOAD = 0x00004;
355+enum RTLD_DEEPBIND = 0x00008;
356+
357+// enum RTLD_GLOBAL = 0x00100; // POSIX
358+// enum RTLD_LOCAL = 0; // POSIX
359+enum RTLD_NODELETE = 0x01000;
360+
361+static if (__USE_GNU)
362+{
363+ RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
364+ {
365+ _dl_mcount_wrapper_check(cast(void*)fctp);
366+ return fctp(args);
367+ }
368+
369+ void _dl_mcount_wrapper_check(void* __selfpc);
370+}
371+// <bits/dlfcn.h>
372+
373+static if (__USE_GNU)
374+{
375+ enum RTLD_NEXT = cast(void *)-1L;
376+ enum RTLD_DEFAULT = cast(void *)0;
377+ alias c_long Lmid_t;
378+ enum LM_ID_BASE = 0;
379+ enum LM_ID_NEWLM = -1;
380+}
381+
382+// void* dlopen(const scope char* __file, int __mode); // POSIX
383+// int dlclose(void* __handle); // POSIX
384+// void* dlsym(void* __handle, const scope char* __name); // POSIX
385+
386+static if (__USE_GNU)
387+{
388+ void* dlmopen(Lmid_t __nsid, const scope char* __file, int __mode);
389+ void* dlvsym(void* __handle, const scope char* __name, const scope char* __version);
390+}
391+
392+// char* dlerror(); // POSIX
393+
394+static if (__USE_GNU)
395+{
396+ struct Dl_info
397+ {
398+ const(char)* dli_fname;
399+ void* dli_fbase;
400+ const(char)* dli_sname;
401+ void* dli_saddr;
402+ }
403+
404+ int dladdr(const scope void* __address, Dl_info* __info);
405+ int dladdr1(void* __address, Dl_info* __info, void** __extra_info, int __flags);
406+
407+ enum
408+ {
409+ RTLD_DL_SYMENT = 1,
410+ RTLD_DL_LINKMAP = 2,
411+ }
412+
413+ int dlinfo(void* __handle, int __request, void* __arg);
414+
415+ enum
416+ {
417+ RTLD_DI_LMID = 1,
418+ RTLD_DI_LINKMAP = 2,
419+ RTLD_DI_CONFIGADDR = 3,
420+ RTLD_DI_SERINFO = 4,
421+ RTLD_DI_SERINFOSIZE = 5,
422+ RTLD_DI_ORIGIN = 6,
423+ RTLD_DI_PROFILENAME = 7,
424+ RTLD_DI_PROFILEOUT = 8,
425+ RTLD_DI_TLS_MODID = 9,
426+ RTLD_DI_TLS_DATA = 10,
427+ RTLD_DI_MAX = 10,
428+ }
429+
430+ struct Dl_serpath
431+ {
432+ char* dls_name;
433+ uint dls_flags;
434+ }
435+
436+ struct Dl_serinfo
437+ {
438+ size_t dls_size;
439+ uint dls_cnt;
440+ Dl_serpath[1] dls_serpath;
441+ }
442+}
443diff --git a/libphobos/libdruntime/core/sys/hurd/elf.d b/libphobos/libdruntime/core/sys/hurd/elf.d
444new file mode 100644
445index 000000000..0cdc29c5a
446--- /dev/null
447+++ b/libphobos/libdruntime/core/sys/hurd/elf.d
448@@ -0,0 +1,162 @@
449+/**
450+ * D header file for GNU/Hurd.
451+ *
452+ * Copyright: Copyright (c) 2026 D Language Foundation
453+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
454+ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/elf.h, glibc elf/elf.h)
455+ */
456+module core.sys.hurd.elf;
457+
458+version (Hurd):
459+extern (C):
460+pure:
461+nothrow:
462+@system:
463+
464+import core.stdc.stdint;
465+public import core.sys.elf;
466+
467+extern (D)
468+{
469+ auto ELF32_ST_VISIBILITY(O)(O o) { return o & 0x03; }
470+ alias ELF32_ST_VISIBILITY ELF64_ST_VISIBILITY;
471+}
472+
473+struct Elf32_Nhdr
474+{
475+ Elf32_Word n_namesz;
476+ Elf32_Word n_descsz;
477+ Elf32_Word n_type;
478+}
479+
480+struct Elf64_Nhdr
481+{
482+ Elf64_Word n_namesz;
483+ Elf64_Word n_descsz;
484+ Elf64_Word n_type;
485+}
486+
487+enum NT_PRSTATUS = 1;
488+enum NT_FPREGSET = 2;
489+enum NT_PRPSINFO = 3;
490+enum NT_PRXREG = 4;
491+enum NT_TASKSTRUCT = 4;
492+enum NT_PLATFORM = 5;
493+enum NT_AUXV = 6;
494+enum NT_GWINDOWS = 7;
495+enum NT_ASRS = 8;
496+enum NT_PSTATUS = 10;
497+enum NT_PSINFO = 13;
498+enum NT_PRCRED = 14;
499+enum NT_UTSNAME = 15;
500+enum NT_LWPSTATUS = 16;
501+enum NT_LWPSINFO = 17;
502+enum NT_PRFPXREG = 20;
503+enum NT_SIGINFO = 0x53494749;
504+enum NT_FILE = 0x46494c45;
505+enum NT_PRXFPREG = 0x46e62b7f;
506+enum NT_PPC_VMX = 0x100;
507+enum NT_PPC_SPE = 0x101;
508+enum NT_PPC_VSX = 0x102;
509+enum NT_386_TLS = 0x200;
510+enum NT_386_IOPERM = 0x201;
511+enum NT_X86_XSTATE = 0x202;
512+enum NT_S390_HIGH_GPRS = 0x300;
513+enum NT_S390_TIMER = 0x301;
514+enum NT_S390_TODCMP = 0x302;
515+enum NT_S390_TODPREG = 0x303;
516+enum NT_S390_CTRS = 0x304;
517+enum NT_S390_PREFIX = 0x305;
518+enum NT_S390_LAST_BREAK = 0x306;
519+enum NT_S390_SYSTEM_CALL = 0x307;
520+enum NT_S390_TDB = 0x308;
521+enum NT_ARM_VFP = 0x400;
522+enum NT_ARM_TLS = 0x401;
523+enum NT_ARM_HW_BREAK = 0x402;
524+enum NT_ARM_HW_WATCH = 0x403;
525+
526+enum NT_VERSION = 1;
527+
528+struct Elf32_Dyn
529+{
530+ Elf32_Sword d_tag;
531+ union _d_un
532+ {
533+ Elf32_Word d_val;
534+ Elf32_Addr d_ptr;
535+ } _d_un d_un;
536+}
537+
538+struct Elf64_Dyn
539+{
540+ Elf64_Sxword d_tag;
541+ union _d_un
542+ {
543+ Elf64_Xword d_val;
544+ Elf64_Addr d_ptr;
545+ } _d_un d_un;
546+}
547+
548+enum NT_GNU_ABI_TAG = 1;
549+enum NT_GNU_HWCAP = 2;
550+enum NT_GNU_BUILD_ID = 3;
551+enum NT_GNU_GOLD_VERSION = 4;
552+
553+struct Elf32_auxv_t
554+{
555+ uint32_t a_type;
556+ union _a_un
557+ {
558+ uint32_t a_val;
559+ } _a_un a_un;
560+}
561+
562+struct Elf64_auxv_t
563+{
564+ uint64_t a_type;
565+ union _a_un
566+ {
567+ uint64_t a_val;
568+ } _a_un a_un;
569+}
570+
571+enum AT_NULL = 0;
572+enum AT_IGNORE = 1;
573+enum AT_EXECFD = 2;
574+enum AT_PHDR = 3;
575+enum AT_PHENT = 4;
576+enum AT_PHNUM = 5;
577+enum AT_PAGESZ = 6;
578+enum AT_BASE = 7;
579+enum AT_FLAGS = 8;
580+enum AT_ENTRY = 9;
581+enum AT_NOTELF = 10;
582+enum AT_UID = 11;
583+enum AT_EUID = 12;
584+enum AT_GID = 13;
585+enum AT_EGID = 14;
586+enum AT_CLKTCK = 17;
587+enum AT_PLATFORM = 15;
588+enum AT_HWCAP = 16;
589+enum AT_FPUCW = 18;
590+enum AT_DCACHEBSIZE = 19;
591+enum AT_ICACHEBSIZE = 20;
592+enum AT_UCACHEBSIZE = 21;
593+enum AT_IGNOREPPC = 22;
594+
595+enum AT_SECURE = 23;
596+
597+enum AT_BASE_PLATFORM = 24;
598+
599+enum AT_RANDOM = 25;
600+
601+enum AT_HWCAP2 = 26;
602+
603+enum AT_EXECFN = 31;
604+enum AT_SYSINFO = 32;
605+enum AT_SYSINFO_EHDR = 33;
606+
607+enum AT_L1I_CACHESHAPE = 34;
608+enum AT_L1D_CACHESHAPE = 35;
609+enum AT_L2_CACHESHAPE = 36;
610+enum AT_L3_CACHESHAPE = 37;
611diff --git a/libphobos/libdruntime/core/sys/hurd/errno.d b/libphobos/libdruntime/core/sys/hurd/errno.d
612new file mode 100644
613index 000000000..db9c83c90
614--- /dev/null
615+++ b/libphobos/libdruntime/core/sys/hurd/errno.d
616@@ -0,0 +1,21 @@
617+/**
618+ * D header file for GNU/Hurd
619+ *
620+ * Copyright: Copyright (c) 2026 D Language Foundation
621+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
622+ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=stdlib/errno.h, glibc stdlib/errno.h)
623+ */
624+module core.sys.hurd.errno;
625+
626+version (Hurd):
627+extern (C):
628+nothrow:
629+
630+public import core.stdc.errno;
631+import core.sys.hurd.config;
632+
633+static if (_GNU_SOURCE)
634+{
635+ extern __gshared char* program_invocation_name, program_invocation_short_name;
636+ alias error_t = int;
637+}
638diff --git a/libphobos/libdruntime/core/sys/hurd/execinfo.d b/libphobos/libdruntime/core/sys/hurd/execinfo.d
639new file mode 100644
640index 000000000..4afeffa8f
641--- /dev/null
642+++ b/libphobos/libdruntime/core/sys/hurd/execinfo.d
643@@ -0,0 +1,16 @@
644+/**
645+ * D header file for GNU/Hurd.
646+ *
647+ * Copyright: Copyright (c) 2026 D Language Foundation
648+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
649+ */
650+module core.sys.hurd.execinfo;
651+
652+version (Hurd):
653+extern (C):
654+nothrow:
655+@nogc:
656+
657+int backtrace(void** buffer, int size);
658+char** backtrace_symbols(const(void*)* buffer, int size);
659+void backtrace_symbols_fd(const(void*)* buffer, int size, int fd);
660diff --git a/libphobos/libdruntime/core/sys/hurd/link.d b/libphobos/libdruntime/core/sys/hurd/link.d
661new file mode 100644
662index 000000000..e9df0fc0b
663--- /dev/null
664+++ b/libphobos/libdruntime/core/sys/hurd/link.d
665@@ -0,0 +1,134 @@
666+/**
667+ * D header file for GNU/Hurd.
668+ * Copyright: Copyright (c) 2026 D Language Foundation
669+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
670+ *
671+ * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/link.h, glibc elf/link.h)
672+ */
673+module core.sys.hurd.link;
674+
675+version (Hurd):
676+extern (C):
677+nothrow:
678+@system:
679+
680+version (X86) version = X86_Any;
681+version (X86_64) version = X86_Any;
682+
683+import core.stdc.stdint : uintptr_t, uint32_t, uint64_t;
684+import core.sys.hurd.config : __WORDSIZE;
685+import core.sys.hurd.dlfcn : Lmid_t;
686+import core.sys.hurd.elf;
687+
688+version (X86_Any)
689+{
690+ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
691+ alias __WORDSIZE __ELF_NATIVE_CLASS;
692+ alias uint32_t Elf_Symndx;
693+}
694+else
695+ static assert(0, "unimplemented");
696+// <bits/elfclass.h>
697+
698+template ElfW(string type)
699+{
700+ mixin("alias Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~" ElfW;");
701+}
702+
703+enum
704+{
705+ RT_CONSISTENT,
706+ RT_ADD,
707+ RT_DELETE,
708+}
709+
710+struct r_debug
711+{
712+ int r_version;
713+ link_map* r_map;
714+ ElfW!"Addr" r_brk;
715+ typeof(RT_CONSISTENT) r_state;
716+ ElfW!"Addr" r_ldbase;
717+}
718+
719+extern r_debug _r_debug;
720+extern ElfW!"Dyn"* _DYNAMIC;
721+
722+struct link_map
723+{
724+ ElfW!"Addr" l_addr;
725+ char* l_name;
726+ ElfW!"Dyn"* l_ld;
727+ link_map* l_next, l_prev;
728+}
729+
730+enum
731+{
732+ LA_ACT_CONSISTENT,
733+ LA_ACT_ADD,
734+ LA_ACT_DELETE,
735+}
736+
737+enum
738+{
739+ LA_SER_ORIG = 0x01,
740+ LA_SER_LIBPATH = 0x02,
741+ LA_SER_RUNPATH = 0x04,
742+ LA_SER_CONFIG = 0x08,
743+ LA_SER_DEFAULT = 0x40,
744+ LA_SER_SECURE = 0x80,
745+}
746+
747+
748+enum
749+{
750+ LA_FLG_BINDTO = 0x01,
751+ LA_FLG_BINDFROM = 0x02,
752+}
753+
754+
755+enum
756+{
757+ LA_SYMB_NOPLTENTER = 0x01,
758+ LA_SYMB_NOPLTEXIT = 0x02,
759+ LA_SYMB_STRUCTCALL = 0x04,
760+ LA_SYMB_DLSYM = 0x08,
761+ LA_SYMB_ALTVALUE = 0x10,
762+}
763+
764+struct dl_phdr_info
765+{
766+ ElfW!"Addr" dlpi_addr;
767+ const(char)* dlpi_name;
768+ const(ElfW!"Phdr")* dlpi_phdr;
769+ ElfW!"Half" dlpi_phnum;
770+
771+ // check the SIZE argument of the dl_iterate_phdr callback whether
772+ // the following members are available
773+ ulong dlpi_adds;
774+ ulong dlpi_subs;
775+
776+ size_t dlpi_tls_modid;
777+ void *dlpi_tls_data;
778+}
779+
780+private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb;
781+private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc;
782+extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
783+extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;
784+
785+// ld.so auditing interfaces prototypes have to be defined by the auditing DSO.
786+extern uint la_version(uint __version);
787+extern void la_activity(uintptr_t *__cookie, uint __flag);
788+extern char* la_objsearch(const(char)* __name, uintptr_t* __cookie,
789+ uint __flag);
790+extern uint la_objopen(link_map* __map, Lmid_t __lmid,
791+ uintptr_t* __cookie);
792+extern void la_preinit(uintptr_t* __cookie);
793+extern uintptr_t la_symbind32(Elf32_Sym* __sym, uint __ndx,
794+ uintptr_t* __refcook, uintptr_t* __defcook,
795+ uint *__flags, const(char)* __symname);
796+extern uintptr_t la_symbind64(Elf64_Sym* __sym, uint __ndx,
797+ uintptr_t* __refcook, uintptr_t* __defcook,
798+ uint* __flags, const(char)* __symname);
799+extern uint la_objclose(uintptr_t *__cookie);
800diff --git a/libphobos/libdruntime/core/sys/hurd/sys/types.d b/libphobos/libdruntime/core/sys/hurd/sys/types.d
801new file mode 100644
802index 000000000..a523a8df3
803--- /dev/null
804+++ b/libphobos/libdruntime/core/sys/hurd/sys/types.d
805@@ -0,0 +1,22 @@
806+/**
807+ * D header file for Hurd extensions to POSIX's sys/types.h.
808+ *
809+ * Copyright: Copyright (c) 2026 D Language Foundation
810+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
811+ */
812+
813+module core.sys.hurd.sys.types;
814+
815+import core.sys.posix.config;
816+
817+version (Hurd):
818+extern(C):
819+@nogc:
820+nothrow:
821+
822+static if (__WORDSIZE == 32)
823+ alias ushort ipc_pid_t;
824+else
825+ alias int ipc_pid_t;
826+
827+alias fsid_t = ulong;
828diff --git a/libphobos/libdruntime/core/sys/hurd/time.d b/libphobos/libdruntime/core/sys/hurd/time.d
829new file mode 100644
830index 000000000..12031e599
831--- /dev/null
832+++ b/libphobos/libdruntime/core/sys/hurd/time.d
833@@ -0,0 +1,15 @@
834+/**
835+ * D header file for Hurd extensions to POSIX's time.h.
836+ *
837+ * Copyright: Copyright (c) 2026 D Language Foundation
838+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
839+ */
840+module core.sys.hurd.time;
841+
842+public import core.sys.posix.time;
843+
844+version (Hurd):
845+
846+enum CLOCK_MONOTONIC_RAW = 4;
847+enum CLOCK_REALTIME_COARSE = 5;
848+enum CLOCK_MONOTONIC_COARSE = 6;
849diff --git a/libphobos/libdruntime/core/sys/hurd/unistd.d b/libphobos/libdruntime/core/sys/hurd/unistd.d
850new file mode 100644
851index 000000000..a351134cd
852--- /dev/null
853+++ b/libphobos/libdruntime/core/sys/hurd/unistd.d
854@@ -0,0 +1,30 @@
855+/**
856+ * D header file for GNU/Hurd.
857+ *
858+ * Copyright: Copyright (c) 2026 D Language Foundation
859+ * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
860+ */
861+module core.sys.hurd.unistd;
862+
863+public import core.sys.posix.unistd;
864+
865+version (Hurd):
866+extern(C):
867+nothrow:
868+@nogc:
869+
870+
871+// Additional seek constants for sparse file handling
872+// from Hurds's unistd.h, stdio.h
873+enum {
874+ /// Offset is relative to the next location containing data
875+ SEEK_DATA = 3,
876+ /// Offset is relative to the next hole (or EOF if file is not sparse)
877+ SEEK_HOLE = 4
878+}
879+
880+/// Prompt for a password without echoing it.
881+char* getpass(const(char)* prompt);
882+
883+/// Close all open file descriptors greater or equal to `lowfd`
884+void closefrom(int lowfd);
885diff --git a/libphobos/libdruntime/core/sys/linux/stdio.d b/libphobos/libdruntime/core/sys/linux/stdio.d
886index 2d079fd71..0b2ea266b 100644
887--- a/libphobos/libdruntime/core/sys/linux/stdio.d
888+++ b/libphobos/libdruntime/core/sys/linux/stdio.d
889@@ -6,6 +6,7 @@
890 * Authors: Danny Milosavljevic
891 */
892 module core.sys.linux.stdio;
893+version (linux):
894 version (CRuntime_Glibc):
895 public import core.sys.posix.stdio;
896 import core.sys.posix.sys.types : ssize_t, off64_t = off_t;
897diff --git a/libphobos/libdruntime/core/sys/posix/dirent.d b/libphobos/libdruntime/core/sys/posix/dirent.d
898index c7e8649d6..be56a7c2d 100644
899--- a/libphobos/libdruntime/core/sys/posix/dirent.d
900+++ b/libphobos/libdruntime/core/sys/posix/dirent.d
901@@ -147,6 +147,17 @@ else version (Solaris)
902 char[1] d_name = 0;
903 }
904 }
905+else version (Hurd)
906+{
907+ struct dirent
908+ {
909+ ino_t d_ino;
910+ ushort d_reclen;
911+ ubyte d_type;
912+ ubyte d_namlen;
913+ char[1] d_name = 0;
914+ }
915+}
916 else
917 {
918 static assert(false, "Unsupported platform");
919diff --git a/libphobos/libdruntime/core/sys/posix/fcntl.d b/libphobos/libdruntime/core/sys/posix/fcntl.d
920index c0e9006a0..b5af01e74 100644
921--- a/libphobos/libdruntime/core/sys/posix/fcntl.d
922+++ b/libphobos/libdruntime/core/sys/posix/fcntl.d
923@@ -843,6 +843,113 @@ else version (Solaris)
924 }
925 }
926 }
927+else version (Hurd)
928+{
929+ enum F_DUPFD = 0;
930+ enum F_GETFD = 1;
931+ enum F_SETFD = 2;
932+ enum F_GETFL = 3;
933+ enum F_SETFL = 4;
934+ enum F_GETOWN = 5;
935+ enum F_SETOWN = 6;
936+
937+ static if ( __USE_FILE_OFFSET64 )
938+ {
939+ enum F_GETLK = F_GETLK64;
940+ enum F_SETLK = F_SETLK64;
941+ enum F_SETLKW = F_SETLKW64;
942+ }
943+ else
944+ {
945+ enum F_GETLK = 7;
946+ enum F_SETLK = 8;
947+ enum F_SETLKW = 9;
948+ }
949+ enum F_GETLK64 = 10;
950+ enum F_SETLK64 = 11;
951+ enum F_SETLKW64 = 12;
952+
953+ enum F_DUPFD_CLOEXEC = 1030;
954+
955+ enum FD_CLOEXEC = 1;
956+
957+ enum F_RDLCK = 1;
958+ enum F_WRLCK = 2;
959+ enum F_UNLCK = 3;
960+
961+ enum O_CREAT = 0x0010;
962+ enum O_EXCL = 0x0020;
963+ enum O_NOCTTY = 0;
964+ enum O_TRUNC = 0x00010000;
965+
966+ enum O_APPEND = 0x0100;
967+ enum O_DSYNC = O_SYNC;
968+ enum O_NONBLOCK = 0x0004;
969+ enum O_RSYNC = O_SYNC;
970+
971+
972+ enum O_ACCMODE = O_RDWR;
973+ enum O_RDONLY = 0x0001;
974+ enum O_WRONLY = 0x0002;
975+ enum O_RDWR = (O_RDONLY|O_WRONLY);
976+
977+ enum O_SYNC = O_FSYNC;
978+ enum O_FSYNC = 0x0400;
979+
980+ enum O_READ = O_RDONLY;
981+ enum O_WRITE = O_WRONLY;
982+ enum O_EXEC = 0x0004;
983+ enum O_NORW = 0;
984+ enum O_LARGEFILE = 0;
985+ enum O_NOLINK = 0x0040;
986+ enum O_NOTRANS = 0x0080;
987+ enum O_NOFOLLOW = 0x00100000;
988+ enum O_DIRECTORY = 0x00200000;
989+ enum O_ASYNC = 0x0200;
990+ enum O_NOATIME = 0x0800;
991+ enum O_SHLOCK = 0x00020000;
992+ enum O_EXLOCK = 0x00040000;
993+ enum O_NDELAY = O_NONBLOCK;
994+ enum O_HURD = (0xffff | O_EXLOCK | O_SHLOCK);
995+ enum O_CLOEXEC = 0x00400000;
996+ enum O_TMPFILE = 0x00800000;
997+ enum O_IGNORE_CTTY = 0x00080000;
998+
999+
1000+ version (X86)
1001+ {
1002+ struct flock
1003+ {
1004+ int l_type;
1005+ int l_whence;
1006+ off_t l_start;
1007+ off_t l_len;
1008+ pid_t l_pid;
1009+ }
1010+ }
1011+ else version (X86_64)
1012+ {
1013+ struct flock
1014+ {
1015+ short l_type;
1016+ short l_whence;
1017+ off_t l_start;
1018+ off_t l_len;
1019+ pid_t l_pid;
1020+ }
1021+ }
1022+ else
1023+ {
1024+ static assert(false, "Unsupported platform");
1025+ }
1026+
1027+ enum AT_FDCWD = -100;
1028+
1029+ enum AT_EACCESS = 0x200;
1030+ enum AT_SYMLINK_NOFOLLOW = 0x100;
1031+ enum AT_SYMLINK_FOLLOW = 0x400;
1032+ enum AT_REMOVEDIR = 0x200;
1033+}
1034 else
1035 {
1036 static assert(false, "Unsupported platform");
1037diff --git a/libphobos/libdruntime/core/sys/posix/netinet/in_.d b/libphobos/libdruntime/core/sys/posix/netinet/in_.d
1038index 5818ee6e2..c5b7c4018 100644
1039--- a/libphobos/libdruntime/core/sys/posix/netinet/in_.d
1040+++ b/libphobos/libdruntime/core/sys/posix/netinet/in_.d
1041@@ -85,18 +85,31 @@ version (CRuntime_Glibc)
1042 //{
1043 // in_addr_t s_addr;
1044 //}
1045+ version (linux)
1046+ {
1047+ private enum __SOCK_SIZE__ = 16;
1048
1049- private enum __SOCK_SIZE__ = 16;
1050+ struct sockaddr_in
1051+ {
1052+ sa_family_t sin_family;
1053+ in_port_t sin_port;
1054+ in_addr sin_addr;
1055
1056- struct sockaddr_in
1057+ /* Pad to size of `struct sockaddr'. */
1058+ ubyte[__SOCK_SIZE__ - sa_family_t.sizeof -
1059+ in_port_t.sizeof - in_addr.sizeof] __pad;
1060+ }
1061+ }
1062+ else version (Hurd)
1063 {
1064- sa_family_t sin_family;
1065- in_port_t sin_port;
1066- in_addr sin_addr;
1067-
1068- /* Pad to size of `struct sockaddr'. */
1069- ubyte[__SOCK_SIZE__ - sa_family_t.sizeof -
1070- in_port_t.sizeof - in_addr.sizeof] __pad;
1071+ struct sockaddr_in
1072+ {
1073+ ubyte sin_len;
1074+ sa_family_t sin_family;
1075+ in_port_t sin_port;
1076+ in_addr sin_addr;
1077+ ubyte[8] sin_zero;
1078+ }
1079 }
1080
1081 enum
1082@@ -513,13 +526,28 @@ version (CRuntime_Glibc)
1083 }
1084 }
1085
1086- struct sockaddr_in6
1087+ version (linux)
1088 {
1089- sa_family_t sin6_family;
1090- in_port_t sin6_port;
1091- uint32_t sin6_flowinfo;
1092- in6_addr sin6_addr;
1093- uint32_t sin6_scope_id;
1094+ struct sockaddr_in6
1095+ {
1096+ ushort sin6_family;
1097+ uint16_t sin6_port;
1098+ uint32_t sin6_flowinfo;
1099+ in6_addr sin6_addr;
1100+ uint32_t sin6_scope_id;
1101+ }
1102+ }
1103+ else version (Hurd)
1104+ {
1105+ struct sockaddr_in6
1106+ {
1107+ uint8_t sin6_len;
1108+ sa_family_t sin6_family;
1109+ uint16_t sin6_port;
1110+ uint32_t sin6_flowinfo;
1111+ in6_addr sin6_addr;
1112+ uint32_t sin6_scope_id;
1113+ }
1114 }
1115
1116 extern __gshared immutable in6_addr in6addr_any;
1117diff --git a/libphobos/libdruntime/core/sys/posix/poll.d b/libphobos/libdruntime/core/sys/posix/poll.d
1118index 5901f62b5..eeaea0b36 100644
1119--- a/libphobos/libdruntime/core/sys/posix/poll.d
1120+++ b/libphobos/libdruntime/core/sys/posix/poll.d
1121@@ -338,6 +338,22 @@ else version (Solaris)
1122 POLLNVAL = 0x0020,
1123 }
1124 }
1125+else version (Hurd)
1126+{
1127+ enum
1128+ {
1129+ POLLIN = 0x001,
1130+ POLLRDNORM = POLLIN,
1131+ POLLRDBAND = POLLPRI,
1132+ POLLPRI = 0x002,
1133+ POLLOUT = 0x004,
1134+ POLLWRNORM = POLLOUT,
1135+ POLLWRBAND = POLLOUT,
1136+ POLLERR = 0x008, /* ocatal 010 */
1137+ POLLHUP = 0x010, /* ocatal 020 */
1138+ POLLNVAL = 0x020, /* ocatal 040 */
1139+ }
1140+}
1141 else
1142 {
1143 static assert(false, "Unsupported platform");
1144diff --git a/libphobos/libdruntime/core/sys/posix/pthread.d b/libphobos/libdruntime/core/sys/posix/pthread.d
1145index 6c5f1a93e..b6c9ca555 100644
1146--- a/libphobos/libdruntime/core/sys/posix/pthread.d
1147+++ b/libphobos/libdruntime/core/sys/posix/pthread.d
1148@@ -104,41 +104,83 @@ void pthread_testcancel();
1149 */
1150 version (CRuntime_Glibc)
1151 {
1152- enum
1153+ version (linux)
1154 {
1155- PTHREAD_CANCEL_ENABLE,
1156- PTHREAD_CANCEL_DISABLE
1157- }
1158+ enum
1159+ {
1160+ PTHREAD_CANCEL_ENABLE,
1161+ PTHREAD_CANCEL_DISABLE
1162+ }
1163
1164- enum
1165- {
1166- PTHREAD_CANCEL_DEFERRED,
1167- PTHREAD_CANCEL_ASYNCHRONOUS
1168- }
1169+ enum
1170+ {
1171+ PTHREAD_CANCEL_DEFERRED,
1172+ PTHREAD_CANCEL_ASYNCHRONOUS
1173+ }
1174
1175- enum PTHREAD_CANCELED = cast(void*) -1;
1176+ enum PTHREAD_CANCELED = cast(void*) -1;
1177
1178- //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
1179+ //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
1180
1181- enum
1182- {
1183- PTHREAD_CREATE_JOINABLE,
1184- PTHREAD_CREATE_DETACHED
1185- }
1186+ enum
1187+ {
1188+ PTHREAD_CREATE_JOINABLE,
1189+ PTHREAD_CREATE_DETACHED
1190+ }
1191
1192- enum
1193- {
1194- PTHREAD_INHERIT_SCHED,
1195- PTHREAD_EXPLICIT_SCHED
1196- }
1197+ enum
1198+ {
1199+ PTHREAD_INHERIT_SCHED,
1200+ PTHREAD_EXPLICIT_SCHED
1201+ }
1202
1203- enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
1204- enum PTHREAD_ONCE_INIT = pthread_once_t.init;
1205+ enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
1206+ enum PTHREAD_ONCE_INIT = pthread_once_t.init;
1207
1208- enum
1209+ enum
1210+ {
1211+ PTHREAD_PROCESS_PRIVATE,
1212+ PTHREAD_PROCESS_SHARED
1213+ }
1214+ }
1215+ else version (Hurd)
1216 {
1217- PTHREAD_PROCESS_PRIVATE,
1218- PTHREAD_PROCESS_SHARED
1219+ enum
1220+ {
1221+ PTHREAD_CANCEL_DISABLE,
1222+ PTHREAD_CANCEL_ENABLE,
1223+ }
1224+
1225+ enum
1226+ {
1227+ PTHREAD_CANCEL_DEFERRED,
1228+ PTHREAD_CANCEL_ASYNCHRONOUS
1229+ }
1230+
1231+ enum PTHREAD_CANCELED = cast(void*) -1;
1232+
1233+ // enum __pthread_cond PTHREAD_COND_INITIALIZER = { __PTHREAD_SPIN_LOCK_INITIALIZER, NULL, NULL, 0, NULL }
1234+
1235+ enum
1236+ {
1237+ PTHREAD_CREATE_JOINABLE = 0,
1238+ PTHREAD_CREATE_DETACHED,
1239+ }
1240+
1241+ enum
1242+ {
1243+ PTHREAD_EXPLICIT_SCHED = 0,
1244+ PTHREAD_INHERIT_SCHED ,
1245+ }
1246+
1247+ enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
1248+ enum PTHREAD_ONCE_INIT = pthread_once_t.init;
1249+
1250+ enum
1251+ {
1252+ PTHREAD_PROCESS_PRIVATE = 0,
1253+ PTHREAD_PROCESS_SHARED,
1254+ }
1255 }
1256 }
1257 else version (Darwin)
1258@@ -455,32 +497,70 @@ alias void function(void*) _pthread_cleanup_routine;
1259 alias void function(void*) @nogc _pthread_cleanup_routine_nogc;
1260 version (CRuntime_Glibc)
1261 {
1262- struct _pthread_cleanup_buffer
1263+ version (linux)
1264 {
1265- _pthread_cleanup_routine __routine;
1266- void* __arg;
1267- int __canceltype;
1268- _pthread_cleanup_buffer* __prev;
1269- }
1270+ struct _pthread_cleanup_buffer
1271+ {
1272+ _pthread_cleanup_routine __routine;
1273+ void* __arg;
1274+ int __canceltype;
1275+ _pthread_cleanup_buffer* __prev;
1276+ }
1277
1278- void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
1279- void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
1280- void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
1281+ void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
1282+ void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
1283+ void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
1284
1285- struct pthread_cleanup
1286- {
1287- _pthread_cleanup_buffer buffer = void;
1288+ struct pthread_cleanup
1289+ {
1290+ _pthread_cleanup_buffer buffer = void;
1291
1292- extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
1293+ extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
1294+ {
1295+ _pthread_cleanup_push( &buffer, routine, arg );
1296+ }
1297+
1298+ extern (D) void pop()( int execute )
1299+ {
1300+ _pthread_cleanup_pop( &buffer, execute );
1301+ }
1302+ }
1303+ }
1304+ else version (Hurd)
1305+ {
1306+ struct __pthread_cancelation_handler
1307 {
1308- _pthread_cleanup_push( &buffer, routine, arg );
1309+ _pthread_cleanup_routine __handler;
1310+ void* __arg;
1311+ __pthread_cancelation_handler* __next;
1312 }
1313
1314- extern (D) void pop()( int execute )
1315+ private __pthread_cancelation_handler** __pthread_get_cleanup_stack();
1316+
1317+ struct pthread_cleanup
1318 {
1319- _pthread_cleanup_pop( &buffer, execute );
1320+ __pthread_cancelation_handler** handlers = void;
1321+ __pthread_cancelation_handler handler = void;
1322+
1323+ extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg)
1324+ {
1325+ handlers = __pthread_get_cleanup_stack();
1326+ handler = __pthread_cancelation_handler(routine, arg, *handlers);
1327+ *handlers = &handler;
1328+ }
1329+ extern (D) void pop()(int execute)
1330+ {
1331+ if (execute)
1332+ handler.__handler(handler.__arg);
1333+ *handlers = handler.__next;
1334+ }
1335 }
1336 }
1337+ else
1338+ {
1339+ static assert(false, "Unsupported platform");
1340+ }
1341+
1342 }
1343 else version (Darwin)
1344 {
1345@@ -1042,9 +1122,24 @@ int pthread_setconcurrency(int);
1346
1347 version (CRuntime_Glibc)
1348 {
1349- enum PTHREAD_MUTEX_NORMAL = 0;
1350- enum PTHREAD_MUTEX_RECURSIVE = 1;
1351- enum PTHREAD_MUTEX_ERRORCHECK = 2;
1352+
1353+ version(linux)
1354+ {
1355+ enum PTHREAD_MUTEX_NORMAL = 0;
1356+ enum PTHREAD_MUTEX_RECURSIVE = 1;
1357+ enum PTHREAD_MUTEX_ERRORCHECK = 2;
1358+ }
1359+ else version(Hurd)
1360+ {
1361+ enum PTHREAD_MUTEX_NORMAL = 0;
1362+ enum PTHREAD_MUTEX_ERRORCHECK = 1;
1363+ enum PTHREAD_MUTEX_RECURSIVE = 2;
1364+
1365+ }
1366+ else
1367+ {
1368+ static assert(false, "Unsupported platform");
1369+ }
1370 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1371
1372 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1373@@ -1378,6 +1473,22 @@ else version (Solaris)
1374 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1375 int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1376 }
1377+else version (Hurd)
1378+{
1379+ enum
1380+ {
1381+ PTHREAD_PRIO_NONE = 0,
1382+ PTHREAD_PRIO_INHERIT,
1383+ PTHREAD_PRIO_PROTECT,
1384+ }
1385+
1386+ int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*);
1387+ int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*);
1388+ int pthread_mutexattr_getprioceiling(const scope pthread_mutexattr_t*, int*);
1389+ int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*);
1390+ int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1391+ int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1392+}
1393
1394 //
1395 // Scheduling (TPS)
1396@@ -1399,10 +1510,21 @@ int pthread_setschedprio(pthread_t, int);
1397
1398 version (CRuntime_Glibc)
1399 {
1400- enum
1401+ version (linux)
1402 {
1403- PTHREAD_SCOPE_SYSTEM,
1404- PTHREAD_SCOPE_PROCESS
1405+ enum
1406+ {
1407+ PTHREAD_SCOPE_SYSTEM,
1408+ PTHREAD_SCOPE_PROCESS
1409+ }
1410+ }
1411+ else version (Hurd)
1412+ {
1413+ enum
1414+ {
1415+ PTHREAD_SCOPE_SYSTEM = 0,
1416+ PTHREAD_SCOPE_PROCESS,
1417+ }
1418 }
1419
1420 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1421diff --git a/libphobos/libdruntime/core/sys/posix/sched.d b/libphobos/libdruntime/core/sys/posix/sched.d
1422index ba7ab8984..008ad0602 100644
1423--- a/libphobos/libdruntime/core/sys/posix/sched.d
1424+++ b/libphobos/libdruntime/core/sys/posix/sched.d
1425@@ -162,6 +162,17 @@ else version (Solaris)
1426 enum SCHED_FX = 6;
1427 enum _SCHED_NEXT = 7;
1428 }
1429+else version (Hurd)
1430+{
1431+ struct sched_param
1432+ {
1433+ int sched_priority;
1434+ }
1435+
1436+ enum SCHED_FIFO = 1;
1437+ enum SCHED_OTHER = 0;
1438+ enum SCHED_RR = 2;
1439+}
1440 else
1441 {
1442 static assert(false, "Unsupported platform");
1443diff --git a/libphobos/libdruntime/core/sys/posix/semaphore.d b/libphobos/libdruntime/core/sys/posix/semaphore.d
1444index 4f3b6e951..ead305cce 100644
1445--- a/libphobos/libdruntime/core/sys/posix/semaphore.d
1446+++ b/libphobos/libdruntime/core/sys/posix/semaphore.d
1447@@ -51,19 +51,31 @@ int sem_wait(sem_t*);
1448
1449 version (CRuntime_Glibc)
1450 {
1451- private alias int __atomic_lock_t;
1452-
1453- private struct _pthread_fastlock
1454+ version(linux)
1455 {
1456- c_long __status;
1457- __atomic_lock_t __spinlock;
1458- }
1459+ private alias int __atomic_lock_t;
1460
1461- struct sem_t
1462+ private struct _pthread_fastlock
1463+ {
1464+ c_long __status;
1465+ __atomic_lock_t __spinlock;
1466+ }
1467+
1468+ struct sem_t
1469+ {
1470+ _pthread_fastlock __sem_lock;
1471+ int __sem_value;
1472+ void* __sem_waiting;
1473+ }
1474+ }
1475+ else version (Hurd)
1476 {
1477- _pthread_fastlock __sem_lock;
1478- int __sem_value;
1479- void* __sem_waiting;
1480+ private enum __SIZEOF_SEM_T = 20;
1481+ union sem_t
1482+ {
1483+ byte[__SIZEOF_SEM_T] __size;
1484+ c_long __align;
1485+ }
1486 }
1487
1488 enum SEM_FAILED = cast(sem_t*) null;
1489diff --git a/libphobos/libdruntime/core/sys/posix/signal.d b/libphobos/libdruntime/core/sys/posix/signal.d
1490index a8b7f7511..235d89c9c 100644
1491--- a/libphobos/libdruntime/core/sys/posix/signal.d
1492+++ b/libphobos/libdruntime/core/sys/posix/signal.d
1493@@ -168,6 +168,9 @@ else version (NetBSD)
1494 enum SIGRTMIN = 33;
1495 enum SIGRTMAX = 63;
1496 }
1497+else version (Hurd)
1498+{
1499+}
1500 else version (linux)
1501 {
1502 // Note: CRuntime_Bionic switched to calling these functions
1503@@ -561,6 +564,24 @@ else version (Solaris)
1504 enum SIGUSR2 = 17;
1505 enum SIGURG = 21;
1506 }
1507+else version (Hurd)
1508+{
1509+ enum SIGALRM = 14;
1510+ enum SIGBUS = 10;
1511+ enum SIGCHLD = 20;
1512+ enum SIGCONT = 19;
1513+ enum SIGHUP = 1;
1514+ enum SIGKILL = 9;
1515+ enum SIGPIPE = 13;
1516+ enum SIGQUIT = 3;
1517+ enum SIGSTOP = 17;
1518+ enum SIGTSTP = 18;
1519+ enum SIGTTIN = 21;
1520+ enum SIGTTOU = 22;
1521+ enum SIGUSR1 = 30;
1522+ enum SIGUSR2 = 31;
1523+ enum SIGURG = 16;
1524+}
1525 else
1526 {
1527 static assert(false, "Unsupported platform");
1528@@ -848,6 +869,26 @@ else version (Darwin)
1529 int sa_flags;
1530 }
1531 }
1532+else version (Hurd)
1533+{
1534+ struct sigaction_t
1535+ {
1536+ static if ( true /* __USE_POSIX199309 */ )
1537+ {
1538+ union
1539+ {
1540+ sigfn_t sa_handler;
1541+ sigactfn_t sa_sigaction;
1542+ }
1543+ }
1544+ else
1545+ {
1546+ sigfn_t sa_handler;
1547+ }
1548+ sigset_t sa_mask;
1549+ int sa_flags;
1550+ }
1551+}
1552 else
1553 {
1554 static assert(false, "Unsupported platform");
1555@@ -1417,6 +1458,41 @@ else version (Solaris)
1556 enum SI_ASYNCIO = -4;
1557 enum SI_MESGQ = -5;
1558 }
1559+else version(Hurd)
1560+{
1561+ enum SIG_HOLD = cast(sigfn_t2) 2;
1562+
1563+ alias c_ulong sigset_t;
1564+
1565+ enum SA_NOCLDSTOP = 0x0008; // (CX|XSI)
1566+
1567+ enum SIG_BLOCK = 1;
1568+ enum SIG_UNBLOCK = 2;
1569+ enum SIG_SETMASK = 3;
1570+
1571+ struct siginfo_t
1572+ {
1573+ int si_signo;
1574+ int si_errno;
1575+ int si_code;
1576+
1577+ pid_t si_pid;
1578+ uid_t si_uid;
1579+ void* si_addr;
1580+ int si_status;
1581+ c_long si_band;
1582+ sigval si_value;
1583+ }
1584+
1585+ enum
1586+ {
1587+ SI_ASYNCIO = -4,
1588+ SI_MESGQ,
1589+ SI_TIMER,
1590+ SI_QUEUE,
1591+ SI_USER
1592+ }
1593+}
1594 else
1595 {
1596 static assert(false, "Unsupported platform");
1597@@ -2375,6 +2451,89 @@ else version (Solaris)
1598 POLL_HUP,
1599 }
1600 }
1601+else version(Hurd)
1602+{
1603+ enum SIGPOLL = 23;
1604+ enum SIGPROF = 27;
1605+ enum SIGSYS = 12;
1606+ enum SIGTRAP = 5;
1607+ enum SIGVTALRM = 26;
1608+ enum SIGXCPU = 24;
1609+ enum SIGXFSZ = 25;
1610+
1611+ enum
1612+ {
1613+ SA_ONSTACK = 0x0001,
1614+ SA_RESETHAND = 0x0004,
1615+ SA_RESTART = 0x0002,
1616+ SA_SIGINFO = 0x0040,
1617+ // SA_NOCLDWAIT = ,
1618+ SA_NODEFER = 0x00010,
1619+ }
1620+
1621+ enum
1622+ {
1623+ ILL_ILLOPC = 1,
1624+ ILL_ILLOPN,
1625+ ILL_ILLADR,
1626+ ILL_ILLTRP,
1627+ ILL_PRVOPC,
1628+ ILL_PRVREG,
1629+ ILL_COPROC,
1630+ ILL_BADSTK
1631+ }
1632+
1633+ enum
1634+ {
1635+ FPE_INTDIV = 1,
1636+ FPE_INTOVF,
1637+ FPE_FLTDIV,
1638+ FPE_FLTOVF,
1639+ FPE_FLTUND,
1640+ FPE_FLTRES,
1641+ FPE_FLTINV,
1642+ FPE_FLTSUB
1643+ }
1644+
1645+ enum
1646+ {
1647+ SEGV_MAPERR = 1,
1648+ SEGV_ACCERR
1649+ }
1650+
1651+ enum
1652+ {
1653+ BUS_ADRALN = 1,
1654+ BUS_ADRERR,
1655+ BUS_OBJERR
1656+ }
1657+
1658+ enum
1659+ {
1660+ TRAP_BRKPT = 1,
1661+ TRAP_TRACE
1662+ }
1663+
1664+ enum
1665+ {
1666+ CLD_EXITED = 1,
1667+ CLD_KILLED,
1668+ CLD_DUMPED,
1669+ CLD_TRAPPED,
1670+ CLD_STOPPED,
1671+ CLD_CONTINUED
1672+ }
1673+
1674+ enum
1675+ {
1676+ POLL_IN = 1,
1677+ POLL_OUT,
1678+ POLL_MSG,
1679+ POLL_ERR,
1680+ POLL_PRI,
1681+ POLL_HUP
1682+ }
1683+}
1684 else
1685 {
1686 static assert(false, "Unsupported platform");
1687@@ -2416,11 +2575,21 @@ int sigrelse(int);
1688
1689 version (CRuntime_Glibc)
1690 {
1691- enum SS_ONSTACK = 1;
1692- enum SS_DISABLE = 2;
1693- enum MINSIGSTKSZ = 2048;
1694- enum SIGSTKSZ = 8192;
1695+ version (linux)
1696+ {
1697+ enum SS_ONSTACK = 1;
1698+ enum SS_DISABLE = 2;
1699+ enum MINSIGSTKSZ = 2048;
1700+ enum SIGSTKSZ = 8192;
1701+ }
1702
1703+ version (Hurd)
1704+ {
1705+ enum SS_ONSTACK = 0x0001;
1706+ enum SS_DISABLE = 0x0004;
1707+ enum MINSIGSTKSZ = 8192;
1708+ enum SIGSTKSZ = (MINSIGSTKSZ + 32768);
1709+ }
1710 //ucontext_t (defined in core.sys.posix.ucontext)
1711 //mcontext_t (defined in core.sys.posix.ucontext)
1712
1713@@ -2980,6 +3149,18 @@ else version (Solaris)
1714 int __sigev_pad2;
1715 }
1716 }
1717+else version (Hurd)
1718+{
1719+ struct sigevent
1720+ {
1721+ sigval sigev_value;
1722+ int sigev_signo;
1723+ int sigev_notify;
1724+
1725+ void function(sigval) sigev_notify_function;
1726+ void* sigev_notify_attributes;
1727+ }
1728+}
1729 else
1730 {
1731 static assert(false, "Unsupported platform");
1732diff --git a/libphobos/libdruntime/core/sys/posix/spawn.d b/libphobos/libdruntime/core/sys/posix/spawn.d
1733index 789053396..b0e184e9f 100644
1734--- a/libphobos/libdruntime/core/sys/posix/spawn.d
1735+++ b/libphobos/libdruntime/core/sys/posix/spawn.d
1736@@ -34,6 +34,8 @@ OpenBSD: https://github.com/openbsd/src/blob/master/include/spawn.h
1737 DragonFlyBSD: https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/include/spawn.h
1738
1739 Solaris: https://github.com/illumos/illumos-gate/blob/master/usr/src/head/spawn.h
1740+
1741+Hurd: https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/spawn.h;hb=HEAD
1742 */
1743
1744 version (OSX) // macOS and iOS only as this API is prohibited on WatchOS and TVOS
1745@@ -370,5 +372,45 @@ else version (Solaris)
1746 int posix_spawnattr_setsigignore_np(posix_spawnattr_t* attr, const sigset_t* sigignore);
1747 }
1748 }
1749+else version (Hurd)
1750+{
1751+ // Source: https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/spawn.h;hb=HEAD
1752+ enum
1753+ {
1754+ POSIX_SPAWN_RESETIDS = 0x01,
1755+ POSIX_SPAWN_SETPGROUP = 0x02,
1756+ POSIX_SPAWN_SETSIGDEF = 0x04,
1757+ POSIX_SPAWN_SETSIGMASK = 0x08,
1758+ POSIX_SPAWN_SETSCHEDPARAM = 0x10,
1759+ POSIX_SPAWN_SETSCHEDULER = 0x20,
1760+ }
1761+ import core.sys.posix.config : _GNU_SOURCE;
1762+ static if (_GNU_SOURCE)
1763+ {
1764+ enum
1765+ {
1766+ POSIX_SPAWN_USEVFORK = 0x40,
1767+ POSIX_SPAWN_SETSID = 0x80
1768+ }
1769+ }
1770+ struct posix_spawnattr_t
1771+ {
1772+ short __flags;
1773+ pid_t __pgrp;
1774+ sigset_t __sd;
1775+ sigset_t __ss;
1776+ sched_param __sp;
1777+ int __policy;
1778+ int[16] __pad;
1779+ }
1780+ private struct __spawn_action;
1781+ struct posix_spawn_file_actions_t
1782+ {
1783+ int __allocated;
1784+ int __used;
1785+ __spawn_action* __actions;
1786+ int[16] __pad;
1787+ }
1788+}
1789 else
1790 static assert(0, "Unsupported OS");
1791diff --git a/libphobos/libdruntime/core/sys/posix/sys/ioctl.d b/libphobos/libdruntime/core/sys/posix/sys/ioctl.d
1792index caf3ebafb..596b19ed5 100644
1793--- a/libphobos/libdruntime/core/sys/posix/sys/ioctl.d
1794+++ b/libphobos/libdruntime/core/sys/posix/sys/ioctl.d
1795@@ -400,6 +400,43 @@ else version (DragonFlyBSD)
1796 else version (Solaris)
1797 {
1798 }
1799+else version (Hurd)
1800+{
1801+ struct tchars
1802+ {
1803+ char t_intrc;
1804+ char t_quitc;
1805+ char t_startc;
1806+ char t_stopc;
1807+ char t_eofc;
1808+ char t_brkc;
1809+ }
1810+ struct ltchars
1811+ {
1812+ char t_suspc;
1813+ char t_dsuspc;
1814+ char t_rprntc;
1815+ char t_flushc;
1816+ char t_werasc;
1817+ char t_lnextc;
1818+ }
1819+ struct sgttyb
1820+ {
1821+ char sg_ispeed;
1822+ char sg_ospeed;
1823+ char sg_erase;
1824+ char sg_kill;
1825+ short sg_flags;
1826+ }
1827+
1828+ struct winsize
1829+ {
1830+ ushort ws_row;
1831+ ushort ws_col;
1832+ ushort ws_xpixel;
1833+ ushort ws_ypixel;
1834+ }
1835+}
1836 else
1837 {
1838 static assert(false, "Unsupported platform");
1839diff --git a/libphobos/libdruntime/core/sys/posix/sys/ipc.d b/libphobos/libdruntime/core/sys/posix/sys/ipc.d
1840index 32caba95a..1d12841ff 100644
1841--- a/libphobos/libdruntime/core/sys/posix/sys/ipc.d
1842+++ b/libphobos/libdruntime/core/sys/posix/sys/ipc.d
1843@@ -246,6 +246,49 @@ else version (Solaris)
1844 enum IPC_SET = 11;
1845 enum IPC_STAT = 12;
1846 }
1847+else version (Hurd)
1848+{
1849+ version (X86)
1850+ {
1851+ struct ipc_perm
1852+ {
1853+ key_t __key;
1854+ ushort uid;
1855+ ushort gid;
1856+ ushort cuid;
1857+ ushort cgid;
1858+ ushort mode;
1859+ ushort __seq;
1860+ }
1861+ }
1862+ else version (X86_64)
1863+ {
1864+ struct ipc_perm
1865+ {
1866+ key_t __key;
1867+ uid_t uid;
1868+ gid_t gid;
1869+ uid_t cuid;
1870+ gid_t cgid;
1871+ mode_t mode;
1872+ ushort __seq;
1873+ }
1874+ }
1875+ else
1876+ {
1877+ static assert(false, "Unsupported platform");
1878+ }
1879+
1880+ enum IPC_CREAT = 0x0200; // 01000
1881+ enum IPC_EXCL = 0x0400; // 02000
1882+ enum IPC_NOWAIT = 0x0800; // 04000
1883+
1884+ enum key_t IPC_PRIVATE = 0;
1885+
1886+ enum IPC_RMID = 0;
1887+ enum IPC_SET = 1;
1888+ enum IPC_STAT = 2;
1889+}
1890 else
1891 {
1892 static assert(false, "Unsupported platform");
1893diff --git a/libphobos/libdruntime/core/sys/posix/sys/mman.d b/libphobos/libdruntime/core/sys/posix/sys/mman.d
1894index b1eb9fa81..35baa422c 100644
1895--- a/libphobos/libdruntime/core/sys/posix/sys/mman.d
1896+++ b/libphobos/libdruntime/core/sys/posix/sys/mman.d
1897@@ -170,6 +170,14 @@ else version (DragonFlyBSD)
1898 else version (Solaris)
1899 {
1900 }
1901+else version (Hurd)
1902+{
1903+ enum POSIX_MADV_NORMAL = 0;
1904+ enum POSIX_MADV_RANDOM = 1;
1905+ enum POSIX_MADV_SEQUENTIAL = 2;
1906+ enum POSIX_MADV_WILLNEED = 3;
1907+ enum POSIX_MADV_DONTNEED = 4;
1908+}
1909 else
1910 {
1911 static assert(false, "Unsupported platform");
1912@@ -234,6 +242,13 @@ else version (Solaris)
1913 enum PROT_WRITE = 0x02;
1914 enum PROT_EXEC = 0x04;
1915 }
1916+else version (Hurd)
1917+{
1918+ enum PROT_NONE = 0x00;
1919+ enum PROT_READ = 0x04;
1920+ enum PROT_WRITE = 0x02;
1921+ enum PROT_EXEC = 0x01;
1922+}
1923 else
1924 {
1925 static assert(false, "Unsupported platform");
1926@@ -473,6 +488,19 @@ else version (Solaris)
1927 enum MS_SYNC = 0x0004;
1928 enum MS_ASYNC = 0x0001;
1929 enum MS_INVALIDATE = 0x0002;
1930+}
1931+ else version (Hurd)
1932+{
1933+ enum MAP_SHARED = 0x0010;
1934+ enum MAP_PRIVATE = 0x0000;
1935+ enum MAP_FIXED = 0x0100;
1936+ enum MAP_ANON = 0x0002;
1937+
1938+ enum MAP_FAILED = cast(void*)-1;
1939+
1940+ enum MS_ASYNC = 1;
1941+ enum MS_INVALIDATE = 0;
1942+ enum MS_SYNC = 2;
1943 }
1944 else
1945 {
1946@@ -590,6 +618,11 @@ else version (Solaris)
1947 enum MCL_CURRENT = 0x0001;
1948 enum MCL_FUTURE = 0x0002;
1949 }
1950+else version (Hurd)
1951+{
1952+ enum MCL_CURRENT = 0x0001;
1953+ enum MCL_FUTURE = 0x0002;
1954+}
1955 else
1956 {
1957 static assert(false, "Unsupported platform");
1958diff --git a/libphobos/libdruntime/core/sys/posix/sys/msg.d b/libphobos/libdruntime/core/sys/posix/sys/msg.d
1959index 19e07bd64..f6b353bf5 100644
1960--- a/libphobos/libdruntime/core/sys/posix/sys/msg.d
1961+++ b/libphobos/libdruntime/core/sys/posix/sys/msg.d
1962@@ -173,6 +173,50 @@ version (linux)
1963 }
1964 }
1965 }
1966+else version (Hurd)
1967+{
1968+ import core.sys.hurd.sys.types;
1969+ enum MSG_STAT = 11;
1970+ enum MSG_INFO = 12;
1971+
1972+ enum MSG_NOERROR = 1 << 12; // octal!10000
1973+ enum MSG_EXCEPT = 2 << 12; // octal!20000
1974+
1975+ struct msginfo
1976+ {
1977+ int msgpool;
1978+ int msgmap;
1979+ int msgmax;
1980+ int msgmnb;
1981+ int msgmni;
1982+ int msgssz;
1983+ int msgtql;
1984+ ushort msgseg;
1985+ }
1986+
1987+ alias ushort msgqnum_t;
1988+ alias ushort msglen_t;
1989+
1990+ private struct msg;
1991+ private struct __wait_queue;
1992+
1993+ struct msqid_ds
1994+ {
1995+ ipc_perm msg_perm;
1996+ msg *__msg_first;
1997+ msg *__msg_last;
1998+ time_t msg_stime;
1999+ time_t msg_rtime;
2000+ time_t msg_ctime;
2001+ __wait_queue *__wwait;
2002+ __wait_queue *__rwait;
2003+ ushort __msg_cbytes;
2004+ msgqnum_t msg_qnum;
2005+ msglen_t msg_qbytes;
2006+ ipc_pid_t msg_lspid;
2007+ ipc_pid_t msg_lrpid;
2008+ }
2009+}
2010 else
2011 {
2012 // https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/msq.h
2013diff --git a/libphobos/libdruntime/core/sys/posix/sys/resource.d b/libphobos/libdruntime/core/sys/posix/sys/resource.d
2014index 3a9a18763..36fd6e959 100644
2015--- a/libphobos/libdruntime/core/sys/posix/sys/resource.d
2016+++ b/libphobos/libdruntime/core/sys/posix/sys/resource.d
2017@@ -477,6 +477,64 @@ else version (Solaris)
2018 RLIMIT_AS = 6,
2019 }
2020 }
2021+else version (Hurd)
2022+{
2023+ enum
2024+ {
2025+ PRIO_PROCESS = 0,
2026+ PRIO_PGRP = 1,
2027+ PRIO_USER = 2,
2028+ }
2029+
2030+ static if (__USE_FILE_OFFSET64)
2031+ alias ulong rlim_t;
2032+ else
2033+ alias c_ulong rlim_t;
2034+
2035+ static if (__USE_FILE_OFFSET64)
2036+ enum RLIM_INFINITY = 0xffffffffffffffffUL;
2037+ else
2038+ enum RLIM_INFINITY = cast(c_ulong)(~0UL);
2039+
2040+ enum RLIM_SAVED_MAX = RLIM_INFINITY;
2041+ enum RLIM_SAVED_CUR = RLIM_INFINITY;
2042+
2043+ enum
2044+ {
2045+ RUSAGE_SELF = 0,
2046+ RUSAGE_CHILDREN = -1,
2047+ }
2048+
2049+ struct rusage
2050+ {
2051+ timeval ru_utime;
2052+ timeval ru_stime;
2053+ c_long ru_maxrss;
2054+ c_long ru_ixrss;
2055+ c_long ru_idrss;
2056+ c_long ru_isrss;
2057+ c_long ru_minflt;
2058+ c_long ru_majflt;
2059+ c_long ru_nswap;
2060+ c_long ru_inblock;
2061+ c_long ru_oublock;
2062+ c_long ru_msgsnd;
2063+ c_long ru_msgrcv;
2064+ c_long ru_nsignals;
2065+ c_long ru_nvcsw;
2066+ c_long ru_nivcsw;
2067+ }
2068+ enum
2069+ {
2070+ RLIMIT_CORE = 4,
2071+ RLIMIT_CPU = 0,
2072+ RLIMIT_DATA = 2,
2073+ RLIMIT_FSIZE = 1,
2074+ RLIMIT_NOFILE = 8,
2075+ RLIMIT_STACK = 3,
2076+ RLIMIT_AS = 10,
2077+ }
2078+}
2079 else
2080 static assert (false, "Unsupported platform");
2081
2082diff --git a/libphobos/libdruntime/core/sys/posix/sys/shm.d b/libphobos/libdruntime/core/sys/posix/sys/shm.d
2083index 6ecdc0def..41c2c9794 100644
2084--- a/libphobos/libdruntime/core/sys/posix/sys/shm.d
2085+++ b/libphobos/libdruntime/core/sys/posix/sys/shm.d
2086@@ -180,6 +180,32 @@ else version (Darwin)
2087 else version (Solaris)
2088 {
2089
2090+}
2091+else version (Hurd)
2092+{
2093+ import core.sys.hurd.sys.types;
2094+ enum SHM_RDONLY = 0x01000; // 010000
2095+ enum SHM_RND = 0x02000; // 020000
2096+ enum SHM_REMAP = 0x4000; // 040000
2097+
2098+ alias short shmatt_t;
2099+
2100+ private struct __vm_area_struct;
2101+
2102+ struct shmid_ds
2103+ {
2104+ ipc_perm shm_perm;
2105+ size_t shm_segsz;
2106+ time_t shm_atime;
2107+ time_t shm_dtime;
2108+ time_t shm_ctime;
2109+ ipc_pid_t shm_cpid;
2110+ ipc_pid_t shm_lpid;
2111+ shmatt_t shm_nattch;
2112+ private ushort __shm_npages;
2113+ private c_ulong* __shm_pages;
2114+ private __vm_area_struct* __attaches;
2115+ }
2116 }
2117 else
2118 {
2119diff --git a/libphobos/libdruntime/core/sys/posix/sys/socket.d b/libphobos/libdruntime/core/sys/posix/sys/socket.d
2120index 7c6fab631..9a74f5981 100644
2121--- a/libphobos/libdruntime/core/sys/posix/sys/socket.d
2122+++ b/libphobos/libdruntime/core/sys/posix/sys/socket.d
2123@@ -1589,6 +1589,153 @@ else version (Solaris)
2124 SHUT_RDWR
2125 }
2126 }
2127+else version (Hurd)
2128+{
2129+ alias uint socklen_t;
2130+ alias ubyte sa_family_t;
2131+
2132+ struct sockaddr
2133+ {
2134+ ubyte ss_len;
2135+ sa_family_t sa_family;
2136+ byte[14] sa_data;
2137+ }
2138+
2139+ private enum : size_t
2140+ {
2141+ _SS_SIZE = 128,
2142+ _SS_PADSIZE = _SS_SIZE - c_ulong.sizeof - sa_family_t.sizeof - ubyte.sizeof,
2143+ }
2144+
2145+ struct sockaddr_storage
2146+ {
2147+ ubyte ss_len;
2148+ sa_family_t ss_family;
2149+ byte[_SS_PADSIZE] __ss_padding;
2150+ c_ulong __ss_align;
2151+ }
2152+ struct msghdr
2153+ {
2154+ void* msg_name;
2155+ socklen_t msg_namelen;
2156+ iovec* msg_iov;
2157+ int msg_iovlen;
2158+ void* msg_control;
2159+ socklen_t msg_controllen;
2160+ int msg_flags;
2161+ }
2162+
2163+ struct cmsghdr
2164+ {
2165+ socklen_t cmsg_len;
2166+ int cmsg_level;
2167+ int cmsg_type;
2168+ }
2169+ enum : uint
2170+ {
2171+ SCM_RIGHTS = 0x01
2172+ }
2173+
2174+ extern (D) inout(ubyte)* CMSG_DATA( return scope inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
2175+ private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
2176+ extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
2177+ {
2178+ return __cmsg_nxthdr(msg, cmsg);
2179+ }
2180+
2181+ extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
2182+ {
2183+ return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
2184+ ? cast(inout(cmsghdr)*) mhdr.msg_control
2185+ : cast(inout(cmsghdr)*) null );
2186+ }
2187+
2188+ extern (D)
2189+ {
2190+ size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
2191+ {
2192+ return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
2193+ }
2194+
2195+ size_t CMSG_LEN( size_t len ) pure nothrow @nogc
2196+ {
2197+ return CMSG_ALIGN(cmsghdr.sizeof) + len;
2198+ }
2199+ }
2200+
2201+ extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
2202+ {
2203+ return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
2204+ }
2205+ struct linger
2206+ {
2207+ int l_onoff;
2208+ int l_linger;
2209+ }
2210+
2211+ enum
2212+ {
2213+ SOCK_DGRAM = 2,
2214+ SOCK_RDM = 4,
2215+ SOCK_SEQPACKET = 5,
2216+ SOCK_STREAM = 1,
2217+ }
2218+ enum
2219+ {
2220+ SOL_SOCKET = 0xffff
2221+ }
2222+ enum
2223+ {
2224+ SO_ACCEPTCONN = 0x0002,
2225+ SO_BROADCAST = 0x0020,
2226+ SO_DEBUG = 0x0001,
2227+ SO_DONTROUTE = 0x0010,
2228+ SO_ERROR = 0x1007,
2229+ SO_KEEPALIVE = 0x0008,
2230+ SO_LINGER = 0x0080,
2231+ SO_OOBINLINE = 0x0100,
2232+ SO_RCVBUF = 0x1002,
2233+ SO_RCVLOWAT = 0x1004,
2234+ SO_RCVTIMEO = 0x1006,
2235+ SO_REUSEADDR = 0x0004,
2236+ SO_REUSEPORT = 0x0200,
2237+ SO_SNDBUF = 0x1002,
2238+ SO_SNDLOWAT = 0x1003,
2239+ SO_SNDTIMEO = 0x1005,
2240+ SO_TYPE = 0x1008
2241+ }
2242+ enum
2243+ {
2244+ SOMAXCONN = 128
2245+ }
2246+ enum : uint
2247+ {
2248+ MSG_CTRUNC = 0x20,
2249+ MSG_DONTROUTE = 0x04,
2250+ MSG_EOR = 0x08,
2251+ MSG_OOB = 0x01,
2252+ MSG_PEEK = 0x02,
2253+ MSG_TRUNC = 0x10,
2254+ MSG_WAITALL = 0x40,
2255+ MSG_NOSIGNAL = 0x0400
2256+ }
2257+
2258+ enum
2259+ {
2260+ AF_INET = 2,
2261+ AF_LOCAL = 1,
2262+ AF_UNIX = AF_LOCAL,
2263+ AF_UNSPEC = 0,
2264+ AF_APPLETALK = 16,
2265+ AF_IPX = 23
2266+ }
2267+ enum
2268+ {
2269+ SHUT_RD = 0,
2270+ SHUT_WR = 1,
2271+ SHUT_RDWR = 2
2272+ }
2273+}
2274 else
2275 {
2276 static assert(false, "Unsupported platform");
2277@@ -1890,6 +2037,13 @@ else version (Solaris)
2278 AF_INET6 = 26,
2279 }
2280 }
2281+else version (Hurd)
2282+{
2283+ enum
2284+ {
2285+ AF_INET6 = 26,
2286+ }
2287+}
2288 else
2289 {
2290 static assert(false, "Unsupported platform");
2291@@ -1951,6 +2105,13 @@ else version (Solaris)
2292 SOCK_RAW = 4,
2293 }
2294 }
2295+else version (Hurd)
2296+{
2297+ enum
2298+ {
2299+ SOCK_RAW = 3,
2300+ }
2301+}
2302 else
2303 {
2304 static assert(false, "Unsupported platform");
2305diff --git a/libphobos/libdruntime/core/sys/posix/sys/stat.d b/libphobos/libdruntime/core/sys/posix/sys/stat.d
2306index b89478fe7..35aac45da 100644
2307--- a/libphobos/libdruntime/core/sys/posix/sys/stat.d
2308+++ b/libphobos/libdruntime/core/sys/posix/sys/stat.d
2309@@ -1412,6 +1412,67 @@ else version (Solaris)
2310 enum S_ISGID = 0x400;
2311 enum S_ISVTX = 0x200;
2312 }
2313+else version (Hurd)
2314+{
2315+ import core.sys.hurd.sys.types;
2316+ static if (__USE_FILE_OFFSET64)
2317+ private enum SPARE_SIZE = 8;
2318+ else
2319+ private enum SPARE_SIZE = 11;
2320+
2321+ struct stat_t
2322+ {
2323+ int st_fstype; /* File system type. */
2324+ fsid_t st_fsid; /* File system ID. */
2325+ alias st_dev = st_fsid;
2326+ ino_t st_ino; /* File number. */
2327+ uint st_gen;
2328+ dev_t st_rdev;
2329+ mode_t st_mode;
2330+ nlink_t st_nlink;
2331+ uid_t st_uid;
2332+ gid_t st_gid;
2333+ off_t st_size;
2334+
2335+ static if (_DEFAULT_SOURCE || _XOPEN_SOURCE >= 700)
2336+ {
2337+ timespec st_atim;
2338+ timespec st_mtim;
2339+ timespec st_ctim;
2340+ extern(D) @safe @property inout pure nothrow
2341+ {
2342+ ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
2343+ ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
2344+ ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
2345+ }
2346+ }
2347+ else
2348+ {
2349+ time_t st_atime;
2350+ c_ulong st_atimensec;
2351+ time_t st_mtime;
2352+ c_ulong st_mtimensec;
2353+ time_t st_ctime;
2354+ c_ulong st_ctimensec;
2355+ }
2356+
2357+ blksize_t st_blksize;
2358+ blkcnt_t st_blocks;
2359+
2360+ uid_t st_author;
2361+ uint st_flags;
2362+ int[SPARE_SIZE] st_spare;
2363+ }
2364+ version (X86) static assert(stat_t.sizeof == 128);
2365+ version (X86_64) static assert(stat_t.sizeof == 176);
2366+
2367+ enum S_ISUID = 0x800; // octal 0004000
2368+ enum S_ISGID = 0x400; // octal 0002000
2369+ enum S_ISVTX = 0x200; // octal 0001000
2370+
2371+ enum UTIME_NOW = -1;
2372+ enum UTIME_OMIT = -2;
2373+}
2374 else
2375 {
2376 static assert(false, "Unsupported platform");
2377@@ -2081,6 +2142,17 @@ else version (Solaris)
2378 enum S_IFDOOR = 0xD000;
2379 enum S_IFPORT = 0xE000;
2380 }
2381+else version (Hurd)
2382+{
2383+ enum S_IFMT = 0xF000; // octal 0170000
2384+ enum S_IFBLK = 0x6000; // octal 0060000
2385+ enum S_IFCHR = 0x2000; // octal 0020000
2386+ enum S_IFIFO = 0x1000; // octal 0010000
2387+ enum S_IFREG = 0x8000; // octal 0100000
2388+ enum S_IFDIR = 0x4000; // octal 0040000
2389+ enum S_IFLNK = 0xA000; // octal 0120000
2390+ enum S_IFSOCK = 0xC000; // octal 0140000
2391+}
2392 else
2393 {
2394 static assert(false, "Unsupported platform");
2395diff --git a/libphobos/libdruntime/core/sys/posix/sys/statvfs.d b/libphobos/libdruntime/core/sys/posix/sys/statvfs.d
2396index eae0e5c95..63ca2440f 100644
2397--- a/libphobos/libdruntime/core/sys/posix/sys/statvfs.d
2398+++ b/libphobos/libdruntime/core/sys/posix/sys/statvfs.d
2399@@ -18,71 +18,117 @@ nothrow:
2400 @nogc:
2401
2402 version (CRuntime_Glibc) {
2403- static if (__WORDSIZE == 32)
2404+ version (linux)
2405 {
2406- version=_STATVFSBUF_F_UNUSED;
2407- }
2408- struct statvfs_t
2409- {
2410- c_ulong f_bsize;
2411- c_ulong f_frsize;
2412- fsblkcnt_t f_blocks;
2413- fsblkcnt_t f_bfree;
2414- fsblkcnt_t f_bavail;
2415- fsfilcnt_t f_files;
2416- fsfilcnt_t f_ffree;
2417- fsfilcnt_t f_favail;
2418- c_ulong f_fsid;
2419- version (_STATVFSBUF_F_UNUSED)
2420+ static if (__WORDSIZE == 32)
2421 {
2422- int __f_unused;
2423+ version=_STATVFSBUF_F_UNUSED;
2424+ }
2425+ struct statvfs_t
2426+ {
2427+ c_ulong f_bsize;
2428+ c_ulong f_frsize;
2429+ fsblkcnt_t f_blocks;
2430+ fsblkcnt_t f_bfree;
2431+ fsblkcnt_t f_bavail;
2432+ fsfilcnt_t f_files;
2433+ fsfilcnt_t f_ffree;
2434+ fsfilcnt_t f_favail;
2435+ c_ulong f_fsid;
2436+ version (_STATVFSBUF_F_UNUSED)
2437+ {
2438+ int __f_unused;
2439+ }
2440+ c_ulong f_flag;
2441+ c_ulong f_namemax;
2442+ int[6] __f_spare;
2443+ }
2444+ /* Definitions for the flag in `f_flag'. These definitions should be
2445+ kept in sync with the definitions in <sys/mount.h>. */
2446+ static if (_GNU_SOURCE)
2447+ {
2448+ enum FFlag
2449+ {
2450+ ST_RDONLY = 1, /* Mount read-only. */
2451+ ST_NOSUID = 2,
2452+ ST_NODEV = 4, /* Disallow access to device special files. */
2453+ ST_NOEXEC = 8, /* Disallow program execution. */
2454+ ST_SYNCHRONOUS = 16, /* Writes are synced at once. */
2455+ ST_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
2456+ ST_WRITE = 128, /* Write on file/directory/symlink. */
2457+ ST_APPEND = 256, /* Append-only file. */
2458+ ST_IMMUTABLE = 512, /* Immutable file. */
2459+ ST_NOATIME = 1024, /* Do not update access times. */
2460+ ST_NODIRATIME = 2048, /* Do not update directory access times. */
2461+ ST_RELATIME = 4096 /* Update atime relative to mtime/ctime. */
2462+
2463+ }
2464+ } /* Use GNU. */
2465+ else
2466+ { // Posix defined:
2467+ enum FFlag
2468+ {
2469+ ST_RDONLY = 1, /* Mount read-only. */
2470+ ST_NOSUID = 2
2471+ }
2472+ }
2473+ static if ( __USE_FILE_OFFSET64 )
2474+ {
2475+ int statvfs64 (const char * file, statvfs_t* buf);
2476+ alias statvfs = statvfs64;
2477+
2478+ int fstatvfs64 (int fildes, statvfs_t *buf) @trusted;
2479+ alias fstatvfs = fstatvfs64;
2480+ }
2481+ else
2482+ {
2483+ int statvfs (const char * file, statvfs_t* buf);
2484+ int fstatvfs (int fildes, statvfs_t *buf);
2485 }
2486- c_ulong f_flag;
2487- c_ulong f_namemax;
2488- int[6] __f_spare;
2489 }
2490- /* Definitions for the flag in `f_flag'. These definitions should be
2491- kept in sync with the definitions in <sys/mount.h>. */
2492- static if (_GNU_SOURCE)
2493+ else version (Hurd)
2494 {
2495- enum FFlag
2496+ import core.sys.hurd.sys.types;
2497+ struct statvfs_t
2498 {
2499- ST_RDONLY = 1, /* Mount read-only. */
2500- ST_NOSUID = 2,
2501- ST_NODEV = 4, /* Disallow access to device special files. */
2502- ST_NOEXEC = 8, /* Disallow program execution. */
2503- ST_SYNCHRONOUS = 16, /* Writes are synced at once. */
2504- ST_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
2505- ST_WRITE = 128, /* Write on file/directory/symlink. */
2506- ST_APPEND = 256, /* Append-only file. */
2507- ST_IMMUTABLE = 512, /* Immutable file. */
2508- ST_NOATIME = 1024, /* Do not update access times. */
2509- ST_NODIRATIME = 2048, /* Do not update directory access times. */
2510- ST_RELATIME = 4096 /* Update atime relative to mtime/ctime. */
2511-
2512+ uint f_type;
2513+ c_ulong f_bsize;
2514+ fsblkcnt_t f_blocks;
2515+ fsblkcnt_t f_bfree;
2516+ fsblkcnt_t f_bavail;
2517+ fsfilcnt_t f_files;
2518+ fsfilcnt_t f_ffree;
2519+ fsid_t f_fsid;
2520+ c_ulong f_namelen;
2521+ fsfilcnt_t f_favail;
2522+ c_ulong f_frsize;
2523+ c_ulong f_flag;
2524+ uint[3] f_spare;
2525 }
2526- } /* Use GNU. */
2527- else
2528- { // Posix defined:
2529+
2530 enum FFlag
2531 {
2532- ST_RDONLY = 1, /* Mount read-only. */
2533- ST_NOSUID = 2
2534+ ST_RDONLY = 1,
2535+ ST_NOSUID = 2,
2536+ ST_NOEXEC = 8,
2537+ ST_SYNCHRONOUS = 16,
2538+ ST_NOATIME = 32,
2539+ ST_RELATIME = 64,
2540 }
2541- }
2542
2543- static if ( __USE_FILE_OFFSET64 )
2544- {
2545- int statvfs64 (const char * file, statvfs_t* buf);
2546- alias statvfs64 statvfs;
2547+ static if ( __USE_FILE_OFFSET64 )
2548+ {
2549+ int statvfs64 (const char * file, statvfs_t* buf);
2550+ alias statvfs = statvfs64;
2551
2552- int fstatvfs64 (int fildes, statvfs_t *buf) @trusted;
2553- alias fstatvfs64 fstatvfs;
2554- }
2555- else
2556- {
2557- int statvfs (const char * file, statvfs_t* buf);
2558- int fstatvfs (int fildes, statvfs_t *buf);
2559+ int fstatvfs64 (int fildes, statvfs_t *buf) @trusted;
2560+ alias fstatvfs = fstatvfs64;
2561+ }
2562+ else
2563+ {
2564+ int statvfs (const char * file, statvfs_t* buf);
2565+ int fstatvfs (int fildes, statvfs_t *buf);
2566+ }
2567 }
2568
2569 }
2570diff --git a/libphobos/libdruntime/core/sys/posix/sys/types.d b/libphobos/libdruntime/core/sys/posix/sys/types.d
2571index 642b3839a..46fb36189 100644
2572--- a/libphobos/libdruntime/core/sys/posix/sys/types.d
2573+++ b/libphobos/libdruntime/core/sys/posix/sys/types.d
2574@@ -279,6 +279,32 @@ else version (Solaris)
2575 alias c_long time_t;
2576 alias uint uid_t;
2577 }
2578+else version (Hurd)
2579+{
2580+ static if ( __USE_FILE_OFFSET64 )
2581+ {
2582+ alias long blkcnt_t;
2583+ alias ulong ino_t;
2584+ alias long off_t;
2585+ }
2586+ else
2587+ {
2588+ alias slong_t blkcnt_t;
2589+ alias ulong_t ino_t;
2590+ alias slong_t off_t;
2591+ }
2592+ alias slong_t blksize_t;
2593+ alias ulong_t dev_t;
2594+ alias uint gid_t;
2595+ alias uint mode_t;
2596+ alias ulong_t nlink_t;
2597+ alias int pid_t;
2598+ //size_t (defined in core.stdc.stddef)
2599+ alias c_long ssize_t;
2600+ alias uint uid_t;
2601+
2602+ alias slong_t time_t;
2603+}
2604 else
2605 {
2606 static assert(false, "Unsupported platform");
2607@@ -390,6 +416,24 @@ else version (Solaris)
2608 alias id_t zoneid_t;
2609 alias id_t ctid_t;
2610 }
2611+else version (Hurd)
2612+{
2613+ static if ( __USE_FILE_OFFSET64 )
2614+ {
2615+ alias ulong fsblkcnt_t;
2616+ alias ulong fsfilcnt_t;
2617+ }
2618+ else
2619+ {
2620+ alias ulong_t fsblkcnt_t;
2621+ alias ulong_t fsfilcnt_t;
2622+ }
2623+ alias slong_t clock_t;
2624+ alias uint id_t;
2625+ alias int key_t;
2626+ alias slong_t suseconds_t;
2627+ alias uint useconds_t;
2628+}
2629 else
2630 {
2631 static assert(false, "Unsupported platform");
2632@@ -413,21 +457,84 @@ pthread_t
2633
2634 version (CRuntime_Glibc)
2635 {
2636- version (X86)
2637+ version (linux)
2638 {
2639- enum __SIZEOF_PTHREAD_ATTR_T = 36;
2640- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2641- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2642- enum __SIZEOF_PTHREAD_COND_T = 48;
2643- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2644- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2645- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2646- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2647- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2648- }
2649- else version (X86_64)
2650- {
2651- static if (__WORDSIZE == 64)
2652+ version (X86)
2653+ {
2654+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2655+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2656+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2657+ enum __SIZEOF_PTHREAD_COND_T = 48;
2658+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2659+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2660+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2661+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2662+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2663+ }
2664+ else version (X86_64)
2665+ {
2666+ static if (__WORDSIZE == 64)
2667+ {
2668+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2669+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2670+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2671+ enum __SIZEOF_PTHREAD_COND_T = 48;
2672+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2673+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2674+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2675+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2676+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2677+ }
2678+ else
2679+ {
2680+ enum __SIZEOF_PTHREAD_ATTR_T = 32;
2681+ enum __SIZEOF_PTHREAD_MUTEX_T = 32;
2682+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2683+ enum __SIZEOF_PTHREAD_COND_T = 48;
2684+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2685+ enum __SIZEOF_PTHREAD_RWLOCK_T = 44;
2686+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2687+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2688+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2689+ }
2690+ }
2691+ else version (AArch64)
2692+ {
2693+ enum __SIZEOF_PTHREAD_ATTR_T = 64;
2694+ enum __SIZEOF_PTHREAD_MUTEX_T = 48;
2695+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 8;
2696+ enum __SIZEOF_PTHREAD_COND_T = 48;
2697+ enum __SIZEOF_PTHREAD_CONDATTR_T = 8;
2698+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2699+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2700+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2701+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 8;
2702+ }
2703+ else version (ARM)
2704+ {
2705+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2706+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2707+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2708+ enum __SIZEOF_PTHREAD_COND_T = 48;
2709+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2710+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2711+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2712+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2713+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2714+ }
2715+ else version (HPPA)
2716+ {
2717+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2718+ enum __SIZEOF_PTHREAD_MUTEX_T = 48;
2719+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2720+ enum __SIZEOF_PTHREAD_COND_T = 48;
2721+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2722+ enum __SIZEOF_PTHREAD_RWLOCK_T = 64;
2723+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2724+ enum __SIZEOF_PTHREAD_BARRIER_T = 48;
2725+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2726+ }
2727+ else version (IA64)
2728 {
2729 enum __SIZEOF_PTHREAD_ATTR_T = 56;
2730 enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2731@@ -439,262 +546,290 @@ version (CRuntime_Glibc)
2732 enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2733 enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2734 }
2735- else
2736+ else version (MIPS32)
2737 {
2738- enum __SIZEOF_PTHREAD_ATTR_T = 32;
2739- enum __SIZEOF_PTHREAD_MUTEX_T = 32;
2740+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2741+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2742 enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2743 enum __SIZEOF_PTHREAD_COND_T = 48;
2744 enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2745- enum __SIZEOF_PTHREAD_RWLOCK_T = 44;
2746+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2747 enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2748 enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2749 enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2750 }
2751+ else version (MIPS64)
2752+ {
2753+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2754+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2755+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2756+ enum __SIZEOF_PTHREAD_COND_T = 48;
2757+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2758+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2759+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2760+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2761+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2762+ }
2763+ else version (PPC)
2764+ {
2765+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2766+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2767+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2768+ enum __SIZEOF_PTHREAD_COND_T = 48;
2769+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2770+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2771+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2772+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2773+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2774+ }
2775+ else version (PPC64)
2776+ {
2777+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2778+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2779+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2780+ enum __SIZEOF_PTHREAD_COND_T = 48;
2781+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2782+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2783+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2784+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2785+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2786+ }
2787+ else version (RISCV32)
2788+ {
2789+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2790+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2791+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2792+ enum __SIZEOF_PTHREAD_COND_T = 48;
2793+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2794+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2795+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2796+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2797+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2798+ }
2799+ else version (RISCV64)
2800+ {
2801+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2802+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2803+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2804+ enum __SIZEOF_PTHREAD_COND_T = 48;
2805+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2806+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2807+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2808+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2809+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2810+ }
2811+ else version (SPARC)
2812+ {
2813+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2814+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2815+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2816+ enum __SIZEOF_PTHREAD_COND_T = 48;
2817+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2818+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2819+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2820+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2821+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2822+ }
2823+ else version (SPARC64)
2824+ {
2825+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2826+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2827+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2828+ enum __SIZEOF_PTHREAD_COND_T = 48;
2829+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2830+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2831+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2832+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2833+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2834+ }
2835+ else version (S390)
2836+ {
2837+ enum __SIZEOF_PTHREAD_ATTR_T = 36;
2838+ enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2839+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2840+ enum __SIZEOF_PTHREAD_COND_T = 48;
2841+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2842+ enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2843+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2844+ enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2845+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2846+ }
2847+ else version (SystemZ)
2848+ {
2849+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2850+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2851+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2852+ enum __SIZEOF_PTHREAD_COND_T = 48;
2853+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2854+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2855+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2856+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2857+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2858+ }
2859+ else version (LoongArch64)
2860+ {
2861+ enum __SIZEOF_PTHREAD_ATTR_T = 56;
2862+ enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2863+ enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2864+ enum __SIZEOF_PTHREAD_COND_T = 48;
2865+ enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2866+ enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2867+ enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2868+ enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2869+ enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2870+ }
2871+ else
2872+ {
2873+ static assert (false, "Unsupported platform");
2874+ }
2875+
2876+ union pthread_attr_t
2877+ {
2878+ byte[__SIZEOF_PTHREAD_ATTR_T] __size;
2879+ c_long __align;
2880+ }
2881+
2882+ private alias int __atomic_lock_t;
2883+
2884+ private struct _pthread_fastlock
2885+ {
2886+ c_long __status;
2887+ __atomic_lock_t __spinlock;
2888+ }
2889+
2890+ private alias void* _pthread_descr;
2891+
2892+ union pthread_cond_t
2893+ {
2894+ byte[__SIZEOF_PTHREAD_COND_T] __size;
2895+ long __align;
2896+ }
2897+
2898+ union pthread_condattr_t
2899+ {
2900+ byte[__SIZEOF_PTHREAD_CONDATTR_T] __size;
2901+ int __align;
2902+ }
2903+
2904+ alias uint pthread_key_t;
2905+
2906+ union pthread_mutex_t
2907+ {
2908+ byte[__SIZEOF_PTHREAD_MUTEX_T] __size;
2909+ c_long __align;
2910+ }
2911+
2912+ union pthread_mutexattr_t
2913+ {
2914+ byte[__SIZEOF_PTHREAD_MUTEXATTR_T] __size;
2915+ int __align;
2916+ }
2917+
2918+ alias int pthread_once_t;
2919+
2920+ struct pthread_rwlock_t
2921+ {
2922+ byte[__SIZEOF_PTHREAD_RWLOCK_T] __size;
2923+ c_long __align;
2924+ }
2925+
2926+ struct pthread_rwlockattr_t
2927+ {
2928+ byte[__SIZEOF_PTHREAD_RWLOCKATTR_T] __size;
2929+ c_long __align;
2930+ }
2931+
2932+ alias c_ulong pthread_t;
2933 }
2934- else version (AArch64)
2935- {
2936- enum __SIZEOF_PTHREAD_ATTR_T = 64;
2937- enum __SIZEOF_PTHREAD_MUTEX_T = 48;
2938- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 8;
2939- enum __SIZEOF_PTHREAD_COND_T = 48;
2940- enum __SIZEOF_PTHREAD_CONDATTR_T = 8;
2941- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2942- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2943- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2944- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 8;
2945- }
2946- else version (ARM)
2947- {
2948- enum __SIZEOF_PTHREAD_ATTR_T = 36;
2949- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2950- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2951- enum __SIZEOF_PTHREAD_COND_T = 48;
2952- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2953- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2954- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2955- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2956- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2957- }
2958- else version (HPPA)
2959- {
2960- enum __SIZEOF_PTHREAD_ATTR_T = 36;
2961- enum __SIZEOF_PTHREAD_MUTEX_T = 48;
2962- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2963- enum __SIZEOF_PTHREAD_COND_T = 48;
2964- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2965- enum __SIZEOF_PTHREAD_RWLOCK_T = 64;
2966- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2967- enum __SIZEOF_PTHREAD_BARRIER_T = 48;
2968- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2969- }
2970- else version (IA64)
2971- {
2972- enum __SIZEOF_PTHREAD_ATTR_T = 56;
2973- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2974- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2975- enum __SIZEOF_PTHREAD_COND_T = 48;
2976- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2977- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
2978- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2979- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
2980- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2981- }
2982- else version (MIPS32)
2983- {
2984- enum __SIZEOF_PTHREAD_ATTR_T = 36;
2985- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
2986- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2987- enum __SIZEOF_PTHREAD_COND_T = 48;
2988- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
2989- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
2990- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
2991- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
2992- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
2993- }
2994- else version (MIPS64)
2995- {
2996- enum __SIZEOF_PTHREAD_ATTR_T = 56;
2997- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
2998- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
2999- enum __SIZEOF_PTHREAD_COND_T = 48;
3000- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3001- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3002- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3003- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3004- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3005- }
3006- else version (PPC)
3007- {
3008- enum __SIZEOF_PTHREAD_ATTR_T = 36;
3009- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
3010- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3011- enum __SIZEOF_PTHREAD_COND_T = 48;
3012- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3013- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
3014- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3015- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
3016- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3017- }
3018- else version (PPC64)
3019- {
3020- enum __SIZEOF_PTHREAD_ATTR_T = 56;
3021- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
3022- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3023- enum __SIZEOF_PTHREAD_COND_T = 48;
3024- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3025- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3026- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3027- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3028- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3029- }
3030- else version (RISCV32)
3031- {
3032- enum __SIZEOF_PTHREAD_ATTR_T = 36;
3033- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
3034- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3035- enum __SIZEOF_PTHREAD_COND_T = 48;
3036- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3037- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
3038- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3039- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
3040- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3041- }
3042- else version (RISCV64)
3043- {
3044- enum __SIZEOF_PTHREAD_ATTR_T = 56;
3045- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
3046- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3047- enum __SIZEOF_PTHREAD_COND_T = 48;
3048- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3049- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3050- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3051- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3052- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3053- }
3054- else version (SPARC)
3055- {
3056- enum __SIZEOF_PTHREAD_ATTR_T = 36;
3057- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
3058- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3059- enum __SIZEOF_PTHREAD_COND_T = 48;
3060- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3061- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
3062- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3063- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
3064- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3065- }
3066- else version (SPARC64)
3067- {
3068- enum __SIZEOF_PTHREAD_ATTR_T = 56;
3069- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
3070- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3071- enum __SIZEOF_PTHREAD_COND_T = 48;
3072- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3073- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3074- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3075- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3076- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3077- }
3078- else version (S390)
3079- {
3080- enum __SIZEOF_PTHREAD_ATTR_T = 36;
3081- enum __SIZEOF_PTHREAD_MUTEX_T = 24;
3082- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3083- enum __SIZEOF_PTHREAD_COND_T = 48;
3084- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3085- enum __SIZEOF_PTHREAD_RWLOCK_T = 32;
3086- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3087- enum __SIZEOF_PTHREAD_BARRIER_T = 20;
3088- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3089- }
3090- else version (SystemZ)
3091- {
3092- enum __SIZEOF_PTHREAD_ATTR_T = 56;
3093- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
3094- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3095- enum __SIZEOF_PTHREAD_COND_T = 48;
3096- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3097- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3098- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3099- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3100- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3101- }
3102- else version (LoongArch64)
3103- {
3104- enum __SIZEOF_PTHREAD_ATTR_T = 56;
3105- enum __SIZEOF_PTHREAD_MUTEX_T = 40;
3106- enum __SIZEOF_PTHREAD_MUTEXATTR_T = 4;
3107- enum __SIZEOF_PTHREAD_COND_T = 48;
3108- enum __SIZEOF_PTHREAD_CONDATTR_T = 4;
3109- enum __SIZEOF_PTHREAD_RWLOCK_T = 56;
3110- enum __SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
3111- enum __SIZEOF_PTHREAD_BARRIER_T = 32;
3112- enum __SIZEOF_PTHREAD_BARRIERATTR_T = 4;
3113- }
3114- else
3115+ else version (Hurd)
3116 {
3117- static assert (false, "Unsupported platform");
3118- }
3119+ import core.sys.hurd.sys.types;
3120+ import core.sys.posix.time: clockid_t;
3121
3122- union pthread_attr_t
3123- {
3124- byte[__SIZEOF_PTHREAD_ATTR_T] __size;
3125- c_long __align;
3126- }
3127+ private struct __sched_param
3128+ {
3129+ int __sched_priority;
3130+ }
3131
3132- private alias int __atomic_lock_t;
3133+ private struct __pthread;
3134
3135- private struct _pthread_fastlock
3136- {
3137- c_long __status;
3138- __atomic_lock_t __spinlock;
3139- }
3140+ struct pthread_attr_t
3141+ {
3142+ __sched_param schedparam;
3143+ void* stackaddr;
3144+ size_t __stacksize;
3145+ size_t __guardsize;
3146+ int __detachstate;
3147+ int __inheritsched;
3148+ int __contentionscope;
3149+ int __schedpolicy;
3150+ }
3151
3152- private alias void* _pthread_descr;
3153+ struct pthread_cond_t
3154+ {
3155+ pthread_spinlock_t __lock;
3156+ __pthread *__queue;
3157+ pthread_condattr_t *__attr;
3158+ uint __wrefs;
3159+ void *__data;
3160+ }
3161
3162- union pthread_cond_t
3163- {
3164- byte[__SIZEOF_PTHREAD_COND_T] __size;
3165- long __align;
3166- }
3167+ struct pthread_condattr_t
3168+ {
3169+ int __pshared;
3170+ clockid_t __clock;
3171+ }
3172
3173- union pthread_condattr_t
3174- {
3175- byte[__SIZEOF_PTHREAD_CONDATTR_T] __size;
3176- int __align;
3177- }
3178+ alias int pthread_key_t;
3179
3180- alias uint pthread_key_t;
3181+ struct pthread_mutex_t
3182+ {
3183+ uint __lock;
3184+ uint __owner_id;
3185+ uint __cnt;
3186+ int __shpid;
3187+ int __type;
3188+ int __flags;
3189+ union
3190+ {
3191+ uint[2] __reserved;
3192+ void *__pointer_aligned;
3193+ }
3194+ }
3195
3196- union pthread_mutex_t
3197- {
3198- byte[__SIZEOF_PTHREAD_MUTEX_T] __size;
3199- c_long __align;
3200- }
3201+ struct pthread_mutexattr_t
3202+ {
3203+ int __prioceiling;
3204+ int __protocol;
3205+ int __pshared;
3206+ int __mutex_type;
3207+ }
3208
3209- union pthread_mutexattr_t
3210- {
3211- byte[__SIZEOF_PTHREAD_MUTEXATTR_T] __size;
3212- int __align;
3213- }
3214+ struct pthread_once_t
3215+ {
3216+ int __run;
3217+ pthread_spinlock_t __lock;
3218+ }
3219
3220- alias int pthread_once_t;
3221+ struct pthread_rwlock_t
3222+ {
3223+ pthread_spinlock_t __held;
3224+ pthread_spinlock_t __lock;
3225+ int __readers;
3226+ __pthread *__readerqueue;
3227+ __pthread *__writerqueue;
3228+ pthread_rwlockattr_t *__attr;
3229+ void *__data;
3230+ }
3231
3232- struct pthread_rwlock_t
3233- {
3234- byte[__SIZEOF_PTHREAD_RWLOCK_T] __size;
3235- c_long __align;
3236- }
3237+ struct pthread_rwlockattr_t
3238+ {
3239+ int __pshared;
3240+ }
3241
3242- struct pthread_rwlockattr_t
3243- {
3244- byte[__SIZEOF_PTHREAD_RWLOCKATTR_T] __size;
3245- c_long __align;
3246+ alias c_long pthread_t;
3247 }
3248-
3249- alias c_ulong pthread_t;
3250-}
3251+ }
3252 else version (CRuntime_Musl)
3253 {
3254 version (D_LP64)
3255@@ -1300,17 +1435,37 @@ pthread_barrierattr_t
3256
3257 version (CRuntime_Glibc)
3258 {
3259- struct pthread_barrier_t
3260- {
3261- byte[__SIZEOF_PTHREAD_BARRIER_T] __size;
3262- c_long __align;
3263- }
3264+ version (linux)
3265+ {
3266+ struct pthread_barrier_t
3267+ {
3268+ byte[__SIZEOF_PTHREAD_BARRIER_T] __size;
3269+ c_long __align;
3270+ }
3271
3272- struct pthread_barrierattr_t
3273- {
3274- byte[__SIZEOF_PTHREAD_BARRIERATTR_T] __size;
3275- int __align;
3276- }
3277+ struct pthread_barrierattr_t
3278+ {
3279+ byte[__SIZEOF_PTHREAD_BARRIERATTR_T] __size;
3280+ int __align;
3281+ }
3282+ }
3283+ else version (Hurd)
3284+ {
3285+ struct pthread_barrier_t
3286+ {
3287+ pthread_spinlock_t __lock;
3288+ __pthread *__queue;
3289+ uint __pending;
3290+ uint __count;
3291+ pthread_barrierattr_t *__attr;
3292+ void *__data;
3293+ }
3294+
3295+ struct pthread_barrierattr_t
3296+ {
3297+ int __pshared;
3298+ }
3299+ }
3300 }
3301 else version (FreeBSD)
3302 {
3303diff --git a/libphobos/libdruntime/core/sys/posix/sys/un.d b/libphobos/libdruntime/core/sys/posix/sys/un.d
3304index 11e98a72a..0d4746ee3 100644
3305--- a/libphobos/libdruntime/core/sys/posix/sys/un.d
3306+++ b/libphobos/libdruntime/core/sys/posix/sys/un.d
3307@@ -104,3 +104,12 @@ else version (Solaris)
3308 byte[108] sun_path;
3309 }
3310 }
3311+else version (Hurd)
3312+{
3313+ struct sockaddr_un
3314+ {
3315+ ubyte sun_len;
3316+ sa_family_t sun_family;
3317+ byte[108] sun_path;
3318+ }
3319+}
3320diff --git a/libphobos/libdruntime/core/sys/posix/sys/utsname.d b/libphobos/libdruntime/core/sys/posix/sys/utsname.d
3321index 5de50aca4..507113b6f 100644
3322--- a/libphobos/libdruntime/core/sys/posix/sys/utsname.d
3323+++ b/libphobos/libdruntime/core/sys/posix/sys/utsname.d
3324@@ -19,19 +19,36 @@ nothrow:
3325
3326 version (CRuntime_Glibc)
3327 {
3328- private enum utsNameLength = 65;
3329-
3330- struct utsname
3331+ version(linux)
3332 {
3333- char[utsNameLength] sysname = 0;
3334- char[utsNameLength] nodename = 0;
3335- char[utsNameLength] release = 0;
3336- char[utsNameLength] version_ = 0;
3337- // TODO Deprecate after version_ has been in an official release.
3338- alias update = version_;
3339- char[utsNameLength] machine = 0;
3340+ private enum utsNameLength = 65;
3341+ struct utsname
3342+ {
3343+ char[utsNameLength] sysname = 0;
3344+ char[utsNameLength] nodename = 0;
3345+ char[utsNameLength] release = 0;
3346+ char[utsNameLength] version_ = 0;
3347+ // TODO Deprecate after version_ has been in an official release.
3348+ alias update = version_;
3349+ char[utsNameLength] machine = 0;
3350+
3351+ char[utsNameLength] __domainname = 0;
3352+ }
3353+ }
3354
3355- char[utsNameLength] __domainname = 0;
3356+ else version(Hurd)
3357+ {
3358+ private enum utsNameLength = 1024;
3359+ struct utsname
3360+ {
3361+ char[utsNameLength] sysname = 0;
3362+ char[utsNameLength] nodename = 0;
3363+ char[utsNameLength] release = 0;
3364+ char[utsNameLength] version_ = 0;
3365+ // TODO Deprecate after version_ has been in an official release.
3366+ alias update = version_;
3367+ char[utsNameLength] machine = 0;
3368+ }
3369 }
3370
3371 int uname(utsname* __name);
3372diff --git a/libphobos/libdruntime/core/sys/posix/sys/wait.d b/libphobos/libdruntime/core/sys/posix/sys/wait.d
3373index f6b0674a3..e1a8fece1 100644
3374--- a/libphobos/libdruntime/core/sys/posix/sys/wait.d
3375+++ b/libphobos/libdruntime/core/sys/posix/sys/wait.d
3376@@ -106,6 +106,15 @@ else version (Solaris)
3377 enum WNOHANG = 64;
3378 enum WUNTRACED = 4;
3379 }
3380+else version (Hurd)
3381+{
3382+ enum WNOHANG = 1;
3383+ enum WUNTRACED = 2;
3384+ private
3385+ {
3386+ enum __W_CONTINUED = 0xFFFF;
3387+ }
3388+}
3389 else
3390 {
3391 static assert(false, "Unsupported platform");
3392@@ -430,6 +439,20 @@ else version (Solaris)
3393 P_CPUID, /* CPU identifier. */
3394 P_PSETID, /* Processor set identifier */
3395 }
3396+}
3397+ else version (Hurd)
3398+{
3399+ enum WEXITED = 16;
3400+ enum WSTOPPED = WUNTRACED;
3401+ enum WCONTINUED = 4;
3402+ enum WNOWAIT = 8;
3403+
3404+ enum idtype_t
3405+ {
3406+ P_ALL,
3407+ P_PID,
3408+ P_PGID
3409+ }
3410 }
3411 else
3412 {
3413diff --git a/libphobos/libdruntime/core/sys/posix/termios.d b/libphobos/libdruntime/core/sys/posix/termios.d
3414index e4a99e686..ecc736715 100644
3415--- a/libphobos/libdruntime/core/sys/posix/termios.d
3416+++ b/libphobos/libdruntime/core/sys/posix/termios.d
3417@@ -831,6 +831,103 @@ else version (Solaris)
3418 enum B460800 = 22;
3419 enum B921600 = 23;
3420 }
3421+else version (Hurd)
3422+{
3423+ alias ubyte cc_t;
3424+ alias uint speed_t;
3425+ alias uint tcflag_t;
3426+
3427+ enum NCCS = 20;
3428+
3429+ struct termios
3430+ {
3431+ tcflag_t c_iflag;
3432+ tcflag_t c_oflag;
3433+ tcflag_t c_cflag;
3434+ tcflag_t c_lflag;
3435+ cc_t[NCCS] c_cc;
3436+ speed_t c_ispeed;
3437+ speed_t c_ospeed;
3438+ }
3439+
3440+ enum VEOF = 0;
3441+ enum VEOL = 1;
3442+ enum VERASE = 3;
3443+ enum VINTR = 8;
3444+ enum VKILL = 5;
3445+ enum VMIN = 16;
3446+ enum VQUIT = 9;
3447+ enum VSTART = 12;
3448+ enum VSTOP = 13;
3449+ enum VSUSP = 10;
3450+ enum VTIME = 17;
3451+
3452+ enum BRKINT = 0x0000002;
3453+ enum ICRNL = 0x0000100;
3454+ enum IGNBRK = 0x0000001;
3455+ enum IGNCR = 0x0000080;
3456+ enum IGNPAR = 0x0000004;
3457+ enum INLCR = 0x0000040;
3458+ enum INPCK = 0x0000010;
3459+ enum ISTRIP = 0x0000020;
3460+ enum IXOFF = 0x0000400;
3461+ enum IXON = 0x0000200;
3462+ enum PARMRK = 0x0000008;
3463+
3464+ enum OPOST = 0x0000001;
3465+
3466+ enum B0 = 0;
3467+ enum B50 = 50;
3468+ enum B75 = 75;
3469+ enum B110 = 110;
3470+ enum B134 = 134;
3471+ enum B150 = 150;
3472+ enum B200 = 200;
3473+ enum B300 = 300;
3474+ enum B600 = 600;
3475+ enum B1200 = 1200;
3476+ enum B1800 = 1800;
3477+ enum B2400 = 2400;
3478+ enum B4800 = 4800;
3479+ enum B9600 = 9600;
3480+ enum B19200 = 19200;
3481+ enum B38400 = 38400;
3482+
3483+ enum CSIZE = 0x0000300;
3484+ enum CS5 = 0x0000000;
3485+ enum CS6 = 0x0000100;
3486+ enum CS7 = 0x0000200;
3487+ enum CS8 = 0x0000300;
3488+ enum CSTOPB = 0x0000400;
3489+ enum CREAD = 0x0000800;
3490+ enum PARENB = 0x0001000;
3491+ enum PARODD = 0x0002000;
3492+ enum HUPCL = 0x0004000;
3493+ enum CLOCAL = 0x0008000;
3494+
3495+ enum ECHO = 0x00000008;
3496+ enum ECHOE = 0x00000002;
3497+ enum ECHOK = 0x00000004;
3498+ enum ECHONL = 0x00000010;
3499+ enum ICANON = 0x00000100;
3500+ enum IEXTEN = 0x00000400;
3501+ enum ISIG = 0x00000080;
3502+ enum NOFLSH = 0x80000000;
3503+ enum TOSTOP = 0x00400000;
3504+
3505+ enum TCSANOW = 0;
3506+ enum TCSADRAIN = 1;
3507+ enum TCSAFLUSH = 2;
3508+
3509+ enum TCIFLUSH = 0;
3510+ enum TCOFLUSH = 1;
3511+ enum TCIOFLUSH = 2;
3512+
3513+ enum TCIOFF = 3;
3514+ enum TCION = 4;
3515+ enum TCOOFF = 1;
3516+ enum TCOON = 2;
3517+}
3518
3519 /*
3520 speed_t cfgetispeed(const scope termios*);
3521diff --git a/libphobos/libdruntime/core/sys/posix/time.d b/libphobos/libdruntime/core/sys/posix/time.d
3522index f49764d19..662ad1c6c 100644
3523--- a/libphobos/libdruntime/core/sys/posix/time.d
3524+++ b/libphobos/libdruntime/core/sys/posix/time.d
3525@@ -155,6 +155,10 @@ else version (Solaris)
3526 {
3527 enum CLOCK_MONOTONIC = 4;
3528 }
3529+else version (Hurd)
3530+{
3531+ enum CLOCK_MONOTONIC = 1;
3532+}
3533 else
3534 {
3535 static assert(0);
3536@@ -254,6 +258,14 @@ else version (Solaris)
3537
3538 alias timespec timestruc_t;
3539 }
3540+else version (Hurd)
3541+{
3542+ struct timespec
3543+ {
3544+ time_t tv_sec;
3545+ c_long tv_nsec;
3546+ }
3547+}
3548 else
3549 {
3550 static assert(false, "Unsupported platform");
3551diff --git a/libphobos/libdruntime/core/thread/osthread.d b/libphobos/libdruntime/core/thread/osthread.d
3552index a9fcf9625..471c4cac2 100644
3553--- a/libphobos/libdruntime/core/thread/osthread.d
3554+++ b/libphobos/libdruntime/core/thread/osthread.d
3555@@ -2154,6 +2154,14 @@ extern (C) void thread_init() @nogc nothrow
3556 enum SIGRTMIN = SIGUSR1;
3557 enum SIGRTMAX = 32;
3558 }
3559+ else version (Hurd)
3560+ {
3561+ // Hurd does not support SIGRTMIN or SIGRTMAX
3562+ // Use SIGUSR1 for SIGRTMIN, SIGUSR2 for SIGRTMIN + 1
3563+ // And use 32 for SIGRTMAX (32 is the max signal number on Hurd)
3564+ enum SIGRTMIN = SIGUSR1;
3565+ enum SIGRTMAX = 32;
3566+ }
3567
3568 if ( suspendSignalNumber == 0 )
3569 {
3570diff --git a/libphobos/libdruntime/core/time.d b/libphobos/libdruntime/core/time.d
3571index c3192fc39..4cfaf8f30 100644
3572--- a/libphobos/libdruntime/core/time.d
3573+++ b/libphobos/libdruntime/core/time.d
3574@@ -330,6 +330,17 @@ else version (Solaris) enum ClockType
3575 second = 6,
3576 threadCPUTime = 7,
3577 }
3578+else version (Hurd) enum ClockType
3579+{
3580+ normal = 0,
3581+ coarse = 2,
3582+ precise = 3,
3583+ // processCPUTime = 4,
3584+ raw = 5,
3585+ second = 6,
3586+ // threadCPUTime = 7,
3587+
3588+}
3589 else
3590 {
3591 // It needs to be decided (and implemented in an appropriate version branch
3592@@ -429,6 +440,20 @@ version (Posix)
3593 case second: assert(0);
3594 }
3595 }
3596+ else version (Hurd)
3597+ {
3598+ import core.sys.hurd.time;
3599+ with(ClockType) final switch (clockType)
3600+ {
3601+ case coarse: return CLOCK_MONOTONIC_COARSE;
3602+ case normal: return CLOCK_MONOTONIC;
3603+ case precise: return CLOCK_MONOTONIC;
3604+ // case processCPUTime: return CLOCK_PROCESS_CPUTIME_ID;
3605+ case raw: return CLOCK_MONOTONIC_RAW;
3606+ // case threadCPUTime: return CLOCK_THREAD_CPUTIME_ID;
3607+ case second: assert(0);
3608+ }
3609+ }
3610 else
3611 // It needs to be decided (and implemented in an appropriate
3612 // version branch here) which clock types new platforms are going
3613diff --git a/libphobos/libdruntime/gcc/backtrace.d b/libphobos/libdruntime/gcc/backtrace.d
3614index db8ec4bcf..cc776570b 100644
3615--- a/libphobos/libdruntime/gcc/backtrace.d
3616+++ b/libphobos/libdruntime/gcc/backtrace.d
3617@@ -408,6 +408,8 @@ private:
3618 import core.sys.openbsd.dlfcn;
3619 else version (Solaris)
3620 import core.sys.solaris.dlfcn;
3621+ else version (Hurd)
3622+ import core.sys.hurd.dlfcn;
3623 else version (Posix)
3624 import core.sys.posix.dlfcn;
3625
3626diff --git a/libphobos/libdruntime/gcc/sections/elf.d b/libphobos/libdruntime/gcc/sections/elf.d
3627index a67dd4a42..748947afd 100644
3628--- a/libphobos/libdruntime/gcc/sections/elf.d
3629+++ b/libphobos/libdruntime/gcc/sections/elf.d
3630@@ -82,6 +82,12 @@ else version (Solaris)
3631 import core.sys.solaris.sys.elf;
3632 import core.sys.solaris.sys.link;
3633 }
3634+else version (Hurd)
3635+{
3636+ import core.sys.hurd.dlfcn;
3637+ import core.sys.hurd.elf;
3638+ import core.sys.hurd.link;
3639+}
3640 else
3641 {
3642 static assert(0, "unimplemented");
3643@@ -781,6 +787,8 @@ version (Shared)
3644 strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate
3645 else version (Solaris)
3646 strtab = cast(const(char)*)(info.dlpi_addr + dyn.d_un.d_ptr); // relocate
3647+ else version (Hurd)
3648+ strtab = cast(const(char)*)(dyn.d_un.d_ptr);
3649 else
3650 static assert(0, "unimplemented");
3651 break;
3652@@ -916,6 +924,7 @@ bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null) nothrow @nogc
3653 else version (NetBSD) enum IterateManually = true;
3654 else version (OpenBSD) enum IterateManually = true;
3655 else version (Solaris) enum IterateManually = true;
3656+ else version (Hurd) enum IterateManually = true;
3657 else enum IterateManually = false;
3658
3659 static if (IterateManually)
3660--
36612.52.0
3662
3663From 50c699d486cb9c365f5a27835eb154900f1a85e0 Mon Sep 17 00:00:00 2001
3664From: Yelninei <[email protected]>
3665Date: Sat, 11 Apr 2026 20:19:20 +0000
3666Subject: [PATCH 3/4] libphobos: Support for GNU/Hurd.
3667
3668---
3669 libphobos/configure.tgt | 3 +++
3670 libphobos/libdruntime/Makefile.am | 10 ++++++++++
3671 libphobos/libdruntime/config/common/threadasm.S | 2 +-
3672 libphobos/libdruntime/config/x86/switchcontext.S | 8 ++++----
3673 libphobos/m4/druntime/os.m4 | 5 +++++
3674 5 files changed, 23 insertions(+), 5 deletions(-)
3675
3676diff --git a/libphobos/configure.tgt b/libphobos/configure.tgt
3677index 715964444..5d0862a91 100644
3678--- a/libphobos/configure.tgt
3679+++ b/libphobos/configure.tgt
3680@@ -76,6 +76,9 @@ case "${target}" in
3681 x86_64-*-linux* | i?86-*-linux*)
3682 LIBPHOBOS_SUPPORTED=yes
3683 ;;
3684+ x86_64-*-gnu* | i?86-*-gnu*)
3685+ LIBPHOBOS_SUPPORTED=yes
3686+ ;;
3687 x86_64-*-netbsd* | i?86-*-netbsd*)
3688 LIBPHOBOS_SUPPORTED=yes
3689 ;;
3690diff --git a/libphobos/libdruntime/Makefile.am b/libphobos/libdruntime/Makefile.am
3691index f17d8beb9..275ba5f65 100644
3692--- a/libphobos/libdruntime/Makefile.am
3693+++ b/libphobos/libdruntime/Makefile.am
3694@@ -38,6 +38,7 @@ ALL_DRUNTIME_INSTALL_DSOURCES = $(DRUNTIME_DSOURCES) \
3695 $(DRUNTIME_DSOURCES_LINUX) $(DRUNTIME_DSOURCES_NETBSD) \
3696 $(DRUNTIME_DSOURCES_OPENBSD) $(DRUNTIME_DSOURCES_POSIX) \
3697 $(DRUNTIME_DSOURCES_SOLARIS) $(DRUNTIME_DSOURCES_WINDOWS) \
3698+ $(DRUNTIME_DSOURCES_HURD) \
3699 $(DRUNTIME_DSOURCES_GENERATED) $(DRUNTIME_DISOURCES) \
3700 $(DRUNTIME_DSOURCES_ELF) $(DRUNTIME_DSOURCES_STDCXX)
3701
3702@@ -76,6 +77,9 @@ endif
3703 if DRUNTIME_OS_SOLARIS
3704 DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_SOLARIS)
3705 endif
3706+if DRUNTIME_OS_HURD
3707+ DRUNTIME_SOURCES_CONFIGURED += $(DRUNTIME_DSOURCES_HURD)
3708+endif
3709 # CPU specific sources
3710 if DRUNTIME_CPU_AARCH64
3711 DRUNTIME_SOURCES_CONFIGURED += config/aarch64/switchcontext.S
3712@@ -355,6 +359,12 @@ DRUNTIME_DSOURCES_SOLARIS = core/sys/solaris/dlfcn.d \
3713 core/sys/solaris/sys/procset.d core/sys/solaris/sys/types.d \
3714 core/sys/solaris/time.d
3715
3716+DRUNTIME_DSOURCES_HURD = core/sys/hurd/config.d \
3717+ core/sys/hurd/dlfcn.d core/sys/hurd/elf.d \
3718+ core/sys/hurd/errno.d core/sys/hurd/execinfo.d \
3719+ core/sys/hurd/link.d core/sys/hurd/sys/types.d \
3720+ core/sys/hurd/time.d core/sys/hurd/unistd.d
3721+
3722 DRUNTIME_DSOURCES_WINDOWS = core/sys/windows/accctrl.d \
3723 core/sys/windows/aclapi.d core/sys/windows/aclui.d \
3724 core/sys/windows/basetsd.d core/sys/windows/basetyps.d \
3725diff --git a/libphobos/libdruntime/config/common/threadasm.S b/libphobos/libdruntime/config/common/threadasm.S
3726index e8bf15d51..1524d77bd 100644
3727--- a/libphobos/libdruntime/config/common/threadasm.S
3728+++ b/libphobos/libdruntime/config/common/threadasm.S
3729@@ -22,7 +22,7 @@ a copy of the GCC Runtime Library Exception along with this program;
3730 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
3731 <http://www.gnu.org/licenses/>. */
3732
3733-#if (__linux__ || __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__) && __ELF__
3734+#if (__linux__ || __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ || __GNU__) && __ELF__
3735 /*
3736 * Mark the resulting object file as not requiring execution permissions on
3737 * stack memory. The absence of this section would mark the whole resulting
3738diff --git a/libphobos/libdruntime/config/x86/switchcontext.S b/libphobos/libdruntime/config/x86/switchcontext.S
3739index beb7c5451..7fc3bada8 100644
3740--- a/libphobos/libdruntime/config/x86/switchcontext.S
3741+++ b/libphobos/libdruntime/config/x86/switchcontext.S
3742@@ -108,7 +108,7 @@ CSYM(fiber_switchContext):
3743
3744 # endif /* defined(__ELF__) */
3745
3746-# if defined(__MACH__)
3747+# if defined(__APPLE__)
3748
3749 # if defined(__i386__)
3750
3751@@ -177,7 +177,7 @@ LASFDE1:
3752 .p2align 2,0
3753 LEFDE1:
3754
3755-# endif /* defined(__MACH__) && defined(__i386__) */
3756+# endif /* defined(__APPLE__) && defined(__i386__) */
3757
3758 # if defined(__x86_64__) && !defined(__ILP32__)
3759
3760@@ -247,8 +247,8 @@ LASFDE1:
3761 .p2align 3,0
3762 LEFDE1:
3763
3764-# endif /* defined(__MACH__) && defined(__x86_64__) && !defined(__ILP32__) */
3765+# endif /* defined(__APPLE__) && defined(__x86_64__) && !defined(__ILP32__) */
3766
3767-# endif /* defined (__MACH__) */
3768+# endif /* defined(__APPLE__) */
3769
3770 #endif /* !defined(__CET__) */
3771diff --git a/libphobos/m4/druntime/os.m4 b/libphobos/m4/druntime/os.m4
3772index 15cde3b04..f907e0929 100644
3773--- a/libphobos/m4/druntime/os.m4
3774+++ b/libphobos/m4/druntime/os.m4
3775@@ -89,6 +89,9 @@ AC_DEFUN([DRUNTIME_OS_SOURCES],
3776 mingw*) druntime_target_os_parsed="mingw"
3777 ;;
3778 *solaris*) druntime_target_os_parsed="solaris"
3779+ ;;
3780+ gnu*) druntime_target_os_parsed="hurd"
3781+ ;;
3782 esac
3783 AM_CONDITIONAL([DRUNTIME_OS_AIX],
3784 [test "$druntime_target_os_parsed" = "aix"])
3785@@ -110,6 +113,8 @@ AC_DEFUN([DRUNTIME_OS_SOURCES],
3786 [test "$druntime_target_os_parsed" = "mingw"])
3787 AM_CONDITIONAL([DRUNTIME_OS_SOLARIS],
3788 [test "$druntime_target_os_parsed" = "solaris"])
3789+ AM_CONDITIONAL([DRUNTIME_OS_HURD],
3790+ [test "$druntime_target_os_parsed" = "hurd"])
3791
3792 druntime_target_posix="no"
3793 case "$druntime_cv_target_os" in
3794--
37952.52.0
3796
3797From 5fe2b8d511b0d6cb920504b276764cd8ae4e5ca4 Mon Sep 17 00:00:00 2001
3798From: Yelninei <[email protected]>
3799Date: Sat, 11 Apr 2026 20:34:11 +0000
3800Subject: [PATCH 4/4] libphobos: regenerate autotools
3801
3802---
3803 libphobos/configure | 21 ++++-
3804 libphobos/libdruntime/Makefile.in | 135 +++++++++++++++++++-----------
3805 2 files changed, 105 insertions(+), 51 deletions(-)
3806
3807diff --git a/libphobos/configure b/libphobos/configure
3808index 9b6a41879..f4de8b556 100755
3809--- a/libphobos/configure
3810+++ b/libphobos/configure
3811@@ -666,6 +666,8 @@ DCFG_ARM_EABI_UNWINDER
3812 DCFG_THREAD_MODEL
3813 DRUNTIME_OS_POSIX_FALSE
3814 DRUNTIME_OS_POSIX_TRUE
3815+DRUNTIME_OS_HURD_FALSE
3816+DRUNTIME_OS_HURD_TRUE
3817 DRUNTIME_OS_SOLARIS_FALSE
3818 DRUNTIME_OS_SOLARIS_TRUE
3819 DRUNTIME_OS_MINGW_FALSE
3820@@ -11867,7 +11869,7 @@ else
3821 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
3822 lt_status=$lt_dlunknown
3823 cat > conftest.$ac_ext <<_LT_EOF
3824-#line 11870 "configure"
3825+#line 11872 "configure"
3826 #include "confdefs.h"
3827
3828 #if HAVE_DLFCN_H
3829@@ -11973,7 +11975,7 @@ else
3830 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
3831 lt_status=$lt_dlunknown
3832 cat > conftest.$ac_ext <<_LT_EOF
3833-#line 11976 "configure"
3834+#line 11978 "configure"
3835 #include "confdefs.h"
3836
3837 #if HAVE_DLFCN_H
3838@@ -14433,6 +14435,9 @@ fi
3839 mingw*) druntime_target_os_parsed="mingw"
3840 ;;
3841 *solaris*) druntime_target_os_parsed="solaris"
3842+ ;;
3843+ gnu*) druntime_target_os_parsed="hurd"
3844+ ;;
3845 esac
3846 if test "$druntime_target_os_parsed" = "aix"; then
3847 DRUNTIME_OS_AIX_TRUE=
3848@@ -14514,6 +14519,14 @@ else
3849 DRUNTIME_OS_SOLARIS_FALSE=
3850 fi
3851
3852+ if test "$druntime_target_os_parsed" = "hurd"; then
3853+ DRUNTIME_OS_HURD_TRUE=
3854+ DRUNTIME_OS_HURD_FALSE='#'
3855+else
3856+ DRUNTIME_OS_HURD_TRUE='#'
3857+ DRUNTIME_OS_HURD_FALSE=
3858+fi
3859+
3860
3861 druntime_target_posix="no"
3862 case "$druntime_cv_target_os" in
3863@@ -16074,6 +16087,10 @@ if test -z "${DRUNTIME_OS_SOLARIS_TRUE}" && test -z "${DRUNTIME_OS_SOLARIS_FALSE
3864 as_fn_error $? "conditional \"DRUNTIME_OS_SOLARIS\" was never defined.
3865 Usually this means the macro was only invoked conditionally." "$LINENO" 5
3866 fi
3867+if test -z "${DRUNTIME_OS_HURD_TRUE}" && test -z "${DRUNTIME_OS_HURD_FALSE}"; then
3868+ as_fn_error $? "conditional \"DRUNTIME_OS_HURD\" was never defined.
3869+Usually this means the macro was only invoked conditionally." "$LINENO" 5
3870+fi
3871 if test -z "${DRUNTIME_OS_POSIX_TRUE}" && test -z "${DRUNTIME_OS_POSIX_FALSE}"; then
3872 as_fn_error $? "conditional \"DRUNTIME_OS_POSIX\" was never defined.
3873 Usually this means the macro was only invoked conditionally." "$LINENO" 5
3874diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in
3875index b6d90362f..813a94cc4 100644
3876--- a/libphobos/libdruntime/Makefile.in
3877+++ b/libphobos/libdruntime/Makefile.in
3878@@ -121,16 +121,17 @@ target_triplet = @target@
3879 @DRUNTIME_OS_MINGW_TRUE@ config/mingw/msvc.c
3880
3881 @DRUNTIME_OS_SOLARIS_TRUE@am__append_10 = $(DRUNTIME_DSOURCES_SOLARIS)
3882+@DRUNTIME_OS_HURD_TRUE@am__append_11 = $(DRUNTIME_DSOURCES_HURD)
3883 # CPU specific sources
3884-@DRUNTIME_CPU_AARCH64_TRUE@am__append_11 = config/aarch64/switchcontext.S
3885-@DRUNTIME_CPU_ARM_TRUE@am__append_12 = config/arm/switchcontext.S
3886-@DRUNTIME_CPU_LOONGARCH_TRUE@am__append_13 = config/loongarch/switchcontext.S
3887-@DRUNTIME_CPU_MIPS_TRUE@am__append_14 = config/mips/switchcontext.S
3888-@DRUNTIME_CPU_POWERPC_TRUE@am__append_15 = config/powerpc/switchcontext.S
3889-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__append_16 = config/mingw/switchcontext.S
3890-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__append_17 = config/x86/switchcontext.S
3891-@DRUNTIME_CPU_SYSTEMZ_TRUE@am__append_18 = config/systemz/get_tls_offset.S
3892-@DRUNTIME_CPU_S390_TRUE@am__append_19 = config/s390/get_tls_offset.S
3893+@DRUNTIME_CPU_AARCH64_TRUE@am__append_12 = config/aarch64/switchcontext.S
3894+@DRUNTIME_CPU_ARM_TRUE@am__append_13 = config/arm/switchcontext.S
3895+@DRUNTIME_CPU_LOONGARCH_TRUE@am__append_14 = config/loongarch/switchcontext.S
3896+@DRUNTIME_CPU_MIPS_TRUE@am__append_15 = config/mips/switchcontext.S
3897+@DRUNTIME_CPU_POWERPC_TRUE@am__append_16 = config/powerpc/switchcontext.S
3898+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__append_17 = config/mingw/switchcontext.S
3899+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__append_18 = config/x86/switchcontext.S
3900+@DRUNTIME_CPU_SYSTEMZ_TRUE@am__append_19 = config/systemz/get_tls_offset.S
3901+@DRUNTIME_CPU_S390_TRUE@am__append_20 = config/s390/get_tls_offset.S
3902 subdir = libdruntime
3903 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
3904 am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
3905@@ -485,52 +486,58 @@ am__objects_23 = core/sys/solaris/dlfcn.lo core/sys/solaris/elf.lo \
3906 core/sys/solaris/sys/procset.lo core/sys/solaris/sys/types.lo \
3907 core/sys/solaris/time.lo
3908 @DRUNTIME_OS_SOLARIS_TRUE@am__objects_24 = $(am__objects_23)
3909-@DRUNTIME_CPU_AARCH64_TRUE@am__objects_25 = config/aarch64/libgdruntime_la-switchcontext.lo
3910-@DRUNTIME_CPU_ARM_TRUE@am__objects_26 = config/arm/libgdruntime_la-switchcontext.lo
3911-@DRUNTIME_CPU_LOONGARCH_TRUE@am__objects_27 = config/loongarch/libgdruntime_la-switchcontext.lo
3912-@DRUNTIME_CPU_MIPS_TRUE@am__objects_28 = config/mips/libgdruntime_la-switchcontext.lo
3913-@DRUNTIME_CPU_POWERPC_TRUE@am__objects_29 = config/powerpc/libgdruntime_la-switchcontext.lo
3914-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_30 = config/mingw/libgdruntime_la-switchcontext.lo
3915-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_31 = config/x86/libgdruntime_la-switchcontext.lo
3916-@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_32 = config/systemz/libgdruntime_la-get_tls_offset.lo
3917-@DRUNTIME_CPU_S390_TRUE@am__objects_33 = config/s390/libgdruntime_la-get_tls_offset.lo
3918-am__objects_34 = $(am__objects_6) $(am__objects_8) $(am__objects_10) \
3919+am__objects_25 = core/sys/hurd/config.lo core/sys/hurd/dlfcn.lo \
3920+ core/sys/hurd/elf.lo core/sys/hurd/errno.lo \
3921+ core/sys/hurd/execinfo.lo core/sys/hurd/link.lo \
3922+ core/sys/hurd/sys/types.lo core/sys/hurd/time.lo \
3923+ core/sys/hurd/unistd.lo
3924+@DRUNTIME_OS_HURD_TRUE@am__objects_26 = $(am__objects_25)
3925+@DRUNTIME_CPU_AARCH64_TRUE@am__objects_27 = config/aarch64/libgdruntime_la-switchcontext.lo
3926+@DRUNTIME_CPU_ARM_TRUE@am__objects_28 = config/arm/libgdruntime_la-switchcontext.lo
3927+@DRUNTIME_CPU_LOONGARCH_TRUE@am__objects_29 = config/loongarch/libgdruntime_la-switchcontext.lo
3928+@DRUNTIME_CPU_MIPS_TRUE@am__objects_30 = config/mips/libgdruntime_la-switchcontext.lo
3929+@DRUNTIME_CPU_POWERPC_TRUE@am__objects_31 = config/powerpc/libgdruntime_la-switchcontext.lo
3930+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_32 = config/mingw/libgdruntime_la-switchcontext.lo
3931+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_33 = config/x86/libgdruntime_la-switchcontext.lo
3932+@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_34 = config/systemz/libgdruntime_la-get_tls_offset.lo
3933+@DRUNTIME_CPU_S390_TRUE@am__objects_35 = config/s390/libgdruntime_la-get_tls_offset.lo
3934+am__objects_36 = $(am__objects_6) $(am__objects_8) $(am__objects_10) \
3935 $(am__objects_12) $(am__objects_14) $(am__objects_16) \
3936 $(am__objects_18) $(am__objects_20) $(am__objects_22) \
3937- $(am__objects_24) $(am__objects_25) $(am__objects_26) \
3938- $(am__objects_27) $(am__objects_28) $(am__objects_29) \
3939- $(am__objects_30) $(am__objects_31) $(am__objects_32) \
3940- $(am__objects_33)
3941-am__objects_35 = gcc/config.lo gcc/libbacktrace.lo
3942-am__objects_36 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
3943- $(am__objects_4) $(am__objects_34) $(am__objects_35)
3944-am_libgdruntime_la_OBJECTS = $(am__objects_36)
3945+ $(am__objects_24) $(am__objects_26) $(am__objects_27) \
3946+ $(am__objects_28) $(am__objects_29) $(am__objects_30) \
3947+ $(am__objects_31) $(am__objects_32) $(am__objects_33) \
3948+ $(am__objects_34) $(am__objects_35)
3949+am__objects_37 = gcc/config.lo gcc/libbacktrace.lo
3950+am__objects_38 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
3951+ $(am__objects_4) $(am__objects_36) $(am__objects_37)
3952+am_libgdruntime_la_OBJECTS = $(am__objects_38)
3953 libgdruntime_la_OBJECTS = $(am_libgdruntime_la_OBJECTS)
3954 am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
3955-am__objects_37 = core/stdc/libgdruntime_convenience_la-errno_.lo \
3956+am__objects_39 = core/stdc/libgdruntime_convenience_la-errno_.lo \
3957 etc/valgrind/libgdruntime_convenience_la-valgrind_.lo
3958-@DRUNTIME_OS_MINGW_TRUE@am__objects_38 = $(am__objects_21) \
3959+@DRUNTIME_OS_MINGW_TRUE@am__objects_40 = $(am__objects_21) \
3960 @DRUNTIME_OS_MINGW_TRUE@ config/mingw/libgdruntime_convenience_la-msvc.lo
3961-@DRUNTIME_CPU_AARCH64_TRUE@am__objects_39 = config/aarch64/libgdruntime_convenience_la-switchcontext.lo
3962-@DRUNTIME_CPU_ARM_TRUE@am__objects_40 = config/arm/libgdruntime_convenience_la-switchcontext.lo
3963-@DRUNTIME_CPU_LOONGARCH_TRUE@am__objects_41 = config/loongarch/libgdruntime_convenience_la-switchcontext.lo
3964-@DRUNTIME_CPU_MIPS_TRUE@am__objects_42 = config/mips/libgdruntime_convenience_la-switchcontext.lo
3965-@DRUNTIME_CPU_POWERPC_TRUE@am__objects_43 = config/powerpc/libgdruntime_convenience_la-switchcontext.lo
3966-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_44 = config/mingw/libgdruntime_convenience_la-switchcontext.lo
3967-@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_45 = config/x86/libgdruntime_convenience_la-switchcontext.lo
3968-@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_46 = config/systemz/libgdruntime_convenience_la-get_tls_offset.lo
3969-@DRUNTIME_CPU_S390_TRUE@am__objects_47 = config/s390/libgdruntime_convenience_la-get_tls_offset.lo
3970-am__objects_48 = $(am__objects_6) $(am__objects_8) $(am__objects_10) \
3971+@DRUNTIME_CPU_AARCH64_TRUE@am__objects_41 = config/aarch64/libgdruntime_convenience_la-switchcontext.lo
3972+@DRUNTIME_CPU_ARM_TRUE@am__objects_42 = config/arm/libgdruntime_convenience_la-switchcontext.lo
3973+@DRUNTIME_CPU_LOONGARCH_TRUE@am__objects_43 = config/loongarch/libgdruntime_convenience_la-switchcontext.lo
3974+@DRUNTIME_CPU_MIPS_TRUE@am__objects_44 = config/mips/libgdruntime_convenience_la-switchcontext.lo
3975+@DRUNTIME_CPU_POWERPC_TRUE@am__objects_45 = config/powerpc/libgdruntime_convenience_la-switchcontext.lo
3976+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_TRUE@am__objects_46 = config/mingw/libgdruntime_convenience_la-switchcontext.lo
3977+@DRUNTIME_CPU_X86_TRUE@@DRUNTIME_OS_MINGW_FALSE@am__objects_47 = config/x86/libgdruntime_convenience_la-switchcontext.lo
3978+@DRUNTIME_CPU_SYSTEMZ_TRUE@am__objects_48 = config/systemz/libgdruntime_convenience_la-get_tls_offset.lo
3979+@DRUNTIME_CPU_S390_TRUE@am__objects_49 = config/s390/libgdruntime_convenience_la-get_tls_offset.lo
3980+am__objects_50 = $(am__objects_6) $(am__objects_8) $(am__objects_10) \
3981 $(am__objects_12) $(am__objects_14) $(am__objects_16) \
3982- $(am__objects_18) $(am__objects_20) $(am__objects_38) \
3983- $(am__objects_24) $(am__objects_39) $(am__objects_40) \
3984- $(am__objects_41) $(am__objects_42) $(am__objects_43) \
3985- $(am__objects_44) $(am__objects_45) $(am__objects_46) \
3986- $(am__objects_47)
3987-am__objects_49 = $(am__objects_1) $(am__objects_37) $(am__objects_3) \
3988- $(am__objects_4) $(am__objects_48) $(am__objects_35)
3989-am__objects_50 = $(am__objects_49)
3990-am_libgdruntime_convenience_la_OBJECTS = $(am__objects_50)
3991+ $(am__objects_18) $(am__objects_20) $(am__objects_40) \
3992+ $(am__objects_24) $(am__objects_26) $(am__objects_41) \
3993+ $(am__objects_42) $(am__objects_43) $(am__objects_44) \
3994+ $(am__objects_45) $(am__objects_46) $(am__objects_47) \
3995+ $(am__objects_48) $(am__objects_49)
3996+am__objects_51 = $(am__objects_1) $(am__objects_39) $(am__objects_3) \
3997+ $(am__objects_4) $(am__objects_50) $(am__objects_37)
3998+am__objects_52 = $(am__objects_51)
3999+am_libgdruntime_convenience_la_OBJECTS = $(am__objects_52)
4000 libgdruntime_convenience_la_OBJECTS = \
4001 $(am_libgdruntime_convenience_la_OBJECTS)
4002 AM_V_P = $(am__v_P_@AM_V@)
4003@@ -794,6 +801,7 @@ ALL_DRUNTIME_INSTALL_DSOURCES = $(DRUNTIME_DSOURCES) \
4004 $(DRUNTIME_DSOURCES_LINUX) $(DRUNTIME_DSOURCES_NETBSD) \
4005 $(DRUNTIME_DSOURCES_OPENBSD) $(DRUNTIME_DSOURCES_POSIX) \
4006 $(DRUNTIME_DSOURCES_SOLARIS) $(DRUNTIME_DSOURCES_WINDOWS) \
4007+ $(DRUNTIME_DSOURCES_HURD) \
4008 $(DRUNTIME_DSOURCES_GENERATED) $(DRUNTIME_DISOURCES) \
4009 $(DRUNTIME_DSOURCES_ELF) $(DRUNTIME_DSOURCES_STDCXX)
4010
4011@@ -805,7 +813,7 @@ DRUNTIME_SOURCES_CONFIGURED = $(am__append_1) $(am__append_2) \
4012 $(am__append_9) $(am__append_10) $(am__append_11) \
4013 $(am__append_12) $(am__append_13) $(am__append_14) \
4014 $(am__append_15) $(am__append_16) $(am__append_17) \
4015- $(am__append_18) $(am__append_19)
4016+ $(am__append_18) $(am__append_19) $(am__append_20)
4017
4018 # Provide __start_minfo, __stop_minfo if linker doesn't.
4019 @DRUNTIME_OS_MINFO_BRACKETING_FALSE@DRTSTUFF = gcc/drtbegin.o gcc/drtend.o
4020@@ -1032,6 +1040,12 @@ DRUNTIME_DSOURCES_SOLARIS = core/sys/solaris/dlfcn.d \
4021 core/sys/solaris/sys/procset.d core/sys/solaris/sys/types.d \
4022 core/sys/solaris/time.d
4023
4024+DRUNTIME_DSOURCES_HURD = core/sys/hurd/config.d \
4025+ core/sys/hurd/dlfcn.d core/sys/hurd/elf.d \
4026+ core/sys/hurd/errno.d core/sys/hurd/execinfo.d \
4027+ core/sys/hurd/link.d core/sys/hurd/sys/types.d \
4028+ core/sys/hurd/time.d core/sys/hurd/unistd.d
4029+
4030 DRUNTIME_DSOURCES_WINDOWS = core/sys/windows/accctrl.d \
4031 core/sys/windows/aclapi.d core/sys/windows/aclui.d \
4032 core/sys/windows/basetsd.d core/sys/windows/basetyps.d \
4033@@ -1953,6 +1967,21 @@ core/sys/solaris/sys/priocntl.lo: \
4034 core/sys/solaris/sys/procset.lo: core/sys/solaris/sys/$(am__dirstamp)
4035 core/sys/solaris/sys/types.lo: core/sys/solaris/sys/$(am__dirstamp)
4036 core/sys/solaris/time.lo: core/sys/solaris/$(am__dirstamp)
4037+core/sys/hurd/$(am__dirstamp):
4038+ @$(MKDIR_P) core/sys/hurd
4039+ @: > core/sys/hurd/$(am__dirstamp)
4040+core/sys/hurd/config.lo: core/sys/hurd/$(am__dirstamp)
4041+core/sys/hurd/dlfcn.lo: core/sys/hurd/$(am__dirstamp)
4042+core/sys/hurd/elf.lo: core/sys/hurd/$(am__dirstamp)
4043+core/sys/hurd/errno.lo: core/sys/hurd/$(am__dirstamp)
4044+core/sys/hurd/execinfo.lo: core/sys/hurd/$(am__dirstamp)
4045+core/sys/hurd/link.lo: core/sys/hurd/$(am__dirstamp)
4046+core/sys/hurd/sys/$(am__dirstamp):
4047+ @$(MKDIR_P) core/sys/hurd/sys
4048+ @: > core/sys/hurd/sys/$(am__dirstamp)
4049+core/sys/hurd/sys/types.lo: core/sys/hurd/sys/$(am__dirstamp)
4050+core/sys/hurd/time.lo: core/sys/hurd/$(am__dirstamp)
4051+core/sys/hurd/unistd.lo: core/sys/hurd/$(am__dirstamp)
4052 config/aarch64/$(am__dirstamp):
4053 @$(MKDIR_P) config/aarch64
4054 @: > config/aarch64/$(am__dirstamp)
4055@@ -2100,6 +2129,10 @@ mostlyclean-compile:
4056 -rm -f core/sys/freebsd/netinet/*.lo
4057 -rm -f core/sys/freebsd/sys/*.$(OBJEXT)
4058 -rm -f core/sys/freebsd/sys/*.lo
4059+ -rm -f core/sys/hurd/*.$(OBJEXT)
4060+ -rm -f core/sys/hurd/*.lo
4061+ -rm -f core/sys/hurd/sys/*.$(OBJEXT)
4062+ -rm -f core/sys/hurd/sys/*.lo
4063 -rm -f core/sys/linux/*.$(OBJEXT)
4064 -rm -f core/sys/linux/*.lo
4065 -rm -f core/sys/linux/linux/*.$(OBJEXT)
4066@@ -2284,6 +2317,8 @@ clean-libtool:
4067 -rm -rf core/sys/freebsd/net/.libs core/sys/freebsd/net/_libs
4068 -rm -rf core/sys/freebsd/netinet/.libs core/sys/freebsd/netinet/_libs
4069 -rm -rf core/sys/freebsd/sys/.libs core/sys/freebsd/sys/_libs
4070+ -rm -rf core/sys/hurd/.libs core/sys/hurd/_libs
4071+ -rm -rf core/sys/hurd/sys/.libs core/sys/hurd/sys/_libs
4072 -rm -rf core/sys/linux/.libs core/sys/linux/_libs
4073 -rm -rf core/sys/linux/linux/.libs core/sys/linux/linux/_libs
4074 -rm -rf core/sys/linux/netinet/.libs core/sys/linux/netinet/_libs
4075@@ -2450,6 +2485,8 @@ distclean-generic:
4076 -rm -f core/sys/freebsd/net/$(am__dirstamp)
4077 -rm -f core/sys/freebsd/netinet/$(am__dirstamp)
4078 -rm -f core/sys/freebsd/sys/$(am__dirstamp)
4079+ -rm -f core/sys/hurd/$(am__dirstamp)
4080+ -rm -f core/sys/hurd/sys/$(am__dirstamp)
4081 -rm -f core/sys/linux/$(am__dirstamp)
4082 -rm -f core/sys/linux/linux/$(am__dirstamp)
4083 -rm -f core/sys/linux/netinet/$(am__dirstamp)
4084--
40852.52.0
4086