[libc-commits] [libc] [libc][darwin] add basic mutex support for darwin (PR #167161)
Shreeyash Pandey via libc-commits
libc-commits at lists.llvm.org
Sat Nov 8 09:56:20 PST 2025
https://github.com/bojle created https://github.com/llvm/llvm-project/pull/167161
This patch adds a basic implementation/wrapper for mutex using the underlying
os_unfair_lock API that macos provides.
>From ab85f49f93c777b94648b5c5bf721753950b4308 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sun, 2 Nov 2025 16:38:36 +0530
Subject: [PATCH 01/15] [libc] allow UnitTest suite to be compiled on darwin
ExecuteFunctionUnix.cpp which is guarded by this check should reliably work
on darwin as it only uses POSIX API - nothing specific to linux.
---
libc/test/UnitTest/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/test/UnitTest/CMakeLists.txt b/libc/test/UnitTest/CMakeLists.txt
index 31d1e9dce8204..028e8e3a2ea67 100644
--- a/libc/test/UnitTest/CMakeLists.txt
+++ b/libc/test/UnitTest/CMakeLists.txt
@@ -83,7 +83,7 @@ add_unittest_framework_library(
)
set(libc_death_test_srcs LibcDeathTestExecutors.cpp)
-if(${LIBC_TARGET_OS} STREQUAL "linux")
+if(${LIBC_TARGET_OS} STREQUAL "linux" OR ${LIBC_TARGET_OS} STREQUAL "darwin")
list(APPEND libc_death_test_srcs ExecuteFunctionUnix.cpp)
endif()
>From 9a5455df48b18bd31f425353841f41f54d99ef4a Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sun, 2 Nov 2025 17:21:01 +0530
Subject: [PATCH 02/15] [libc] fix EXPECT_EXIT suspend/timeout for darwin
Fixes: https://github.com/llvm/llvm-project/issues/166059
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/test/UnitTest/ExecuteFunctionUnix.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libc/test/UnitTest/ExecuteFunctionUnix.cpp b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
index c0e85c2144005..0b450578adde2 100644
--- a/libc/test/UnitTest/ExecuteFunctionUnix.cpp
+++ b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
@@ -13,6 +13,7 @@
#include <poll.h>
#include <signal.h>
#include <stdio.h>
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
@@ -58,7 +59,7 @@ ProcessStatus invoke_in_subprocess(FunctionCaller *func, int timeout_ms) {
::close(pipe_fds[1]);
struct pollfd poll_fd {
- pipe_fds[0], 0, 0
+ pipe_fds[0], POLLIN, 0
};
// No events requested so this call will only return after the timeout or if
// the pipes peer was closed, signaling the process exited.
>From 34f4b8b04f29d57bfc3aced106302ab91a4a1bff Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sun, 2 Nov 2025 18:50:43 +0530
Subject: [PATCH 03/15] [libc] fix formatting
---
libc/test/UnitTest/ExecuteFunctionUnix.cpp | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/libc/test/UnitTest/ExecuteFunctionUnix.cpp b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
index 0b450578adde2..7c2eb7c6e887c 100644
--- a/libc/test/UnitTest/ExecuteFunctionUnix.cpp
+++ b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
@@ -13,7 +13,6 @@
#include <poll.h>
#include <signal.h>
#include <stdio.h>
-#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
@@ -58,9 +57,7 @@ ProcessStatus invoke_in_subprocess(FunctionCaller *func, int timeout_ms) {
}
::close(pipe_fds[1]);
- struct pollfd poll_fd {
- pipe_fds[0], POLLIN, 0
- };
+ struct pollfd poll_fd{pipe_fds[0], POLLIN, 0};
// No events requested so this call will only return after the timeout or if
// the pipes peer was closed, signaling the process exited.
if (::poll(&poll_fd, 1, timeout_ms) == -1) {
>From 3d60307c8cfd96fb5572abbf59b309008fb0fc1e Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Tue, 4 Nov 2025 16:52:04 +0530
Subject: [PATCH 04/15] [libc][darwin] add syscall numbers from macos sdk
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
.../__support/OSUtil/darwin/aarch64/syscall.h | 561 ++++++++++++++++++
1 file changed, 561 insertions(+)
diff --git a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
index dc98c07a8ba33..6cbbd11a79ae3 100644
--- a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
+++ b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
@@ -110,4 +110,565 @@ LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
#undef REGISTER_CONSTRAINT_5
#undef REGISTER_CONSTRAINT_6
+#define SYS_syscall 0
+#define SYS_exit 1
+#define SYS_fork 2
+#define SYS_read 3
+#define SYS_write 4
+#define SYS_open 5
+#define SYS_close 6
+#define SYS_wait4 7
+/* 8 old creat */
+#define SYS_link 9
+#define SYS_unlink 10
+/* 11 old execv */
+#define SYS_chdir 12
+#define SYS_fchdir 13
+#define SYS_mknod 14
+#define SYS_chmod 15
+#define SYS_chown 16
+/* 17 old break */
+#define SYS_getfsstat 18
+/* 19 old lseek */
+#define SYS_getpid 20
+/* 21 old mount */
+/* 22 old umount */
+#define SYS_setuid 23
+#define SYS_getuid 24
+#define SYS_geteuid 25
+#define SYS_ptrace 26
+#define SYS_recvmsg 27
+#define SYS_sendmsg 28
+#define SYS_recvfrom 29
+#define SYS_accept 30
+#define SYS_getpeername 31
+#define SYS_getsockname 32
+#define SYS_access 33
+#define SYS_chflags 34
+#define SYS_fchflags 35
+#define SYS_sync 36
+#define SYS_kill 37
+#define SYS_crossarch_trap 38
+#define SYS_getppid 39
+/* 40 old lstat */
+#define SYS_dup 41
+#define SYS_pipe 42
+#define SYS_getegid 43
+/* 44 old profil */
+/* 45 old ktrace */
+#define SYS_sigaction 46
+#define SYS_getgid 47
+#define SYS_sigprocmask 48
+#define SYS_getlogin 49
+#define SYS_setlogin 50
+#define SYS_acct 51
+#define SYS_sigpending 52
+#define SYS_sigaltstack 53
+#define SYS_ioctl 54
+#define SYS_reboot 55
+#define SYS_revoke 56
+#define SYS_symlink 57
+#define SYS_readlink 58
+#define SYS_execve 59
+#define SYS_umask 60
+#define SYS_chroot 61
+/* 62 old fstat */
+/* 63 used internally and reserved */
+/* 64 old getpagesize */
+#define SYS_msync 65
+#define SYS_vfork 66
+#define SYS_oslog_coproc_reg 67
+#define SYS_oslog_coproc 68
+/* 69 old sbrk */
+/* 70 old sstk */
+/* 71 old mmap */
+/* 72 old vadvise */
+#define SYS_munmap 73
+#define SYS_mprotect 74
+#define SYS_madvise 75
+/* 76 old vhangup */
+/* 77 old vlimit */
+#define SYS_mincore 78
+#define SYS_getgroups 79
+#define SYS_setgroups 80
+#define SYS_getpgrp 81
+#define SYS_setpgid 82
+#define SYS_setitimer 83
+/* 84 old wait */
+#define SYS_swapon 85
+#define SYS_getitimer 86
+/* 87 old gethostname */
+/* 88 old sethostname */
+#define SYS_getdtablesize 89
+#define SYS_dup2 90
+/* 91 old getdopt */
+#define SYS_fcntl 92
+#define SYS_select 93
+/* 94 old setdopt */
+#define SYS_fsync 95
+#define SYS_setpriority 96
+#define SYS_socket 97
+#define SYS_connect 98
+/* 99 old accept */
+#define SYS_getpriority 100
+/* 101 old send */
+/* 102 old recv */
+/* 103 old sigreturn */
+#define SYS_bind 104
+#define SYS_setsockopt 105
+#define SYS_listen 106
+/* 107 old vtimes */
+/* 108 old sigvec */
+/* 109 old sigblock */
+/* 110 old sigsetmask */
+#define SYS_sigsuspend 111
+/* 112 old sigstack */
+/* 113 old recvmsg */
+/* 114 old sendmsg */
+/* 115 old vtrace */
+#define SYS_gettimeofday 116
+#define SYS_getrusage 117
+#define SYS_getsockopt 118
+/* 119 old resuba */
+#define SYS_readv 120
+#define SYS_writev 121
+#define SYS_settimeofday 122
+#define SYS_fchown 123
+#define SYS_fchmod 124
+/* 125 old recvfrom */
+#define SYS_setreuid 126
+#define SYS_setregid 127
+#define SYS_rename 128
+/* 129 old truncate */
+/* 130 old ftruncate */
+#define SYS_flock 131
+#define SYS_mkfifo 132
+#define SYS_sendto 133
+#define SYS_shutdown 134
+#define SYS_socketpair 135
+#define SYS_mkdir 136
+#define SYS_rmdir 137
+#define SYS_utimes 138
+#define SYS_futimes 139
+#define SYS_adjtime 140
+/* 141 old getpeername */
+#define SYS_gethostuuid 142
+/* 143 old sethostid */
+/* 144 old getrlimit */
+/* 145 old setrlimit */
+/* 146 old killpg */
+#define SYS_setsid 147
+/* 148 old setquota */
+/* 149 old qquota */
+/* 150 old getsockname */
+#define SYS_getpgid 151
+#define SYS_setprivexec 152
+#define SYS_pread 153
+#define SYS_pwrite 154
+#define SYS_nfssvc 155
+/* 156 old getdirentries */
+#define SYS_statfs 157
+#define SYS_fstatfs 158
+#define SYS_unmount 159
+/* 160 old async_daemon */
+#define SYS_getfh 161
+/* 162 old getdomainname */
+/* 163 old setdomainname */
+/* 164 */
+#define SYS_quotactl 165
+/* 166 old exportfs */
+#define SYS_mount 167
+/* 168 old ustat */
+#define SYS_csops 169
+#define SYS_csops_audittoken 170
+/* 171 old wait3 */
+/* 172 old rpause */
+#define SYS_waitid 173
+/* 174 old getdents */
+/* 175 old gc_control */
+/* 176 old add_profil */
+#define SYS_kdebug_typefilter 177
+#define SYS_kdebug_trace_string 178
+#define SYS_kdebug_trace64 179
+#define SYS_kdebug_trace 180
+#define SYS_setgid 181
+#define SYS_setegid 182
+#define SYS_seteuid 183
+#define SYS_sigreturn 184
+#define SYS_panic_with_data 185
+#define SYS_thread_selfcounts 186
+#define SYS_fdatasync 187
+#define SYS_stat 188
+#define SYS_fstat 189
+#define SYS_lstat 190
+#define SYS_pathconf 191
+#define SYS_fpathconf 192
+/* 193 old getfsstat */
+#define SYS_getrlimit 194
+#define SYS_setrlimit 195
+#define SYS_getdirentries 196
+#define SYS_mmap 197
+/* 198 old __syscall */
+#define SYS_lseek 199
+#define SYS_truncate 200
+#define SYS_ftruncate 201
+#define SYS_sysctl 202
+#define SYS_mlock 203
+#define SYS_munlock 204
+#define SYS_undelete 205
+/* 206 old ATsocket */
+/* 207 old ATgetmsg */
+/* 208 old ATputmsg */
+/* 209 old ATsndreq */
+/* 210 old ATsndrsp */
+/* 211 old ATgetreq */
+/* 212 old ATgetrsp */
+/* 213 Reserved for AppleTalk */
+/* 214 */
+/* 215 */
+#define SYS_open_dprotected_np 216
+#define SYS_fsgetpath_ext 217
+#define SYS_openat_dprotected_np 218
+/* 219 old fstatv */
+#define SYS_getattrlist 220
+#define SYS_setattrlist 221
+#define SYS_getdirentriesattr 222
+#define SYS_exchangedata 223
+/* 224 old checkuseraccess or fsgetpath */
+#define SYS_searchfs 225
+#define SYS_delete 226
+#define SYS_copyfile 227
+#define SYS_fgetattrlist 228
+#define SYS_fsetattrlist 229
+#define SYS_poll 230
+/* 231 old watchevent */
+/* 232 old waitevent */
+/* 233 old modwatch */
+#define SYS_getxattr 234
+#define SYS_fgetxattr 235
+#define SYS_setxattr 236
+#define SYS_fsetxattr 237
+#define SYS_removexattr 238
+#define SYS_fremovexattr 239
+#define SYS_listxattr 240
+#define SYS_flistxattr 241
+#define SYS_fsctl 242
+#define SYS_initgroups 243
+#define SYS_posix_spawn 244
+#define SYS_ffsctl 245
+/* 246 */
+/* 247 old nfsclnt */
+#define SYS_fhopen 248
+/* 249 */
+#define SYS_minherit 250
+#define SYS_semsys 251
+#define SYS_msgsys 252
+#define SYS_shmsys 253
+#define SYS_semctl 254
+#define SYS_semget 255
+#define SYS_semop 256
+/* 257 old semconfig */
+#define SYS_msgctl 258
+#define SYS_msgget 259
+#define SYS_msgsnd 260
+#define SYS_msgrcv 261
+#define SYS_shmat 262
+#define SYS_shmctl 263
+#define SYS_shmdt 264
+#define SYS_shmget 265
+#define SYS_shm_open 266
+#define SYS_shm_unlink 267
+#define SYS_sem_open 268
+#define SYS_sem_close 269
+#define SYS_sem_unlink 270
+#define SYS_sem_wait 271
+#define SYS_sem_trywait 272
+#define SYS_sem_post 273
+#define SYS_sysctlbyname 274
+/* 275 old sem_init */
+/* 276 old sem_destroy */
+#define SYS_open_extended 277
+#define SYS_umask_extended 278
+#define SYS_stat_extended 279
+#define SYS_lstat_extended 280
+#define SYS_fstat_extended 281
+#define SYS_chmod_extended 282
+#define SYS_fchmod_extended 283
+#define SYS_access_extended 284
+#define SYS_settid 285
+#define SYS_gettid 286
+#define SYS_setsgroups 287
+#define SYS_getsgroups 288
+#define SYS_setwgroups 289
+#define SYS_getwgroups 290
+#define SYS_mkfifo_extended 291
+#define SYS_mkdir_extended 292
+#define SYS_identitysvc 293
+#define SYS_shared_region_check_np 294
+/* 295 old shared_region_map_np */
+#define SYS_vm_pressure_monitor 296
+#define SYS_psynch_rw_longrdlock 297
+#define SYS_psynch_rw_yieldwrlock 298
+#define SYS_psynch_rw_downgrade 299
+#define SYS_psynch_rw_upgrade 300
+#define SYS_psynch_mutexwait 301
+#define SYS_psynch_mutexdrop 302
+#define SYS_psynch_cvbroad 303
+#define SYS_psynch_cvsignal 304
+#define SYS_psynch_cvwait 305
+#define SYS_psynch_rw_rdlock 306
+#define SYS_psynch_rw_wrlock 307
+#define SYS_psynch_rw_unlock 308
+#define SYS_psynch_rw_unlock2 309
+#define SYS_getsid 310
+#define SYS_settid_with_pid 311
+#define SYS_psynch_cvclrprepost 312
+#define SYS_aio_fsync 313
+#define SYS_aio_return 314
+#define SYS_aio_suspend 315
+#define SYS_aio_cancel 316
+#define SYS_aio_error 317
+#define SYS_aio_read 318
+#define SYS_aio_write 319
+#define SYS_lio_listio 320
+/* 321 old __pthread_cond_wait */
+#define SYS_iopolicysys 322
+#define SYS_process_policy 323
+#define SYS_mlockall 324
+#define SYS_munlockall 325
+/* 326 */
+#define SYS_issetugid 327
+#define SYS___pthread_kill 328
+#define SYS___pthread_sigmask 329
+#define SYS___sigwait 330
+#define SYS___disable_threadsignal 331
+#define SYS___pthread_markcancel 332
+#define SYS___pthread_canceled 333
+#define SYS___semwait_signal 334
+/* 335 old utrace */
+#define SYS_proc_info 336
+#define SYS_sendfile 337
+#define SYS_stat64 338
+#define SYS_fstat64 339
+#define SYS_lstat64 340
+#define SYS_stat64_extended 341
+#define SYS_lstat64_extended 342
+#define SYS_fstat64_extended 343
+#define SYS_getdirentries64 344
+#define SYS_statfs64 345
+#define SYS_fstatfs64 346
+#define SYS_getfsstat64 347
+#define SYS___pthread_chdir 348
+#define SYS___pthread_fchdir 349
+#define SYS_audit 350
+#define SYS_auditon 351
+/* 352 */
+#define SYS_getauid 353
+#define SYS_setauid 354
+/* 355 old getaudit */
+/* 356 old setaudit */
+#define SYS_getaudit_addr 357
+#define SYS_setaudit_addr 358
+#define SYS_auditctl 359
+#define SYS_bsdthread_create 360
+#define SYS_bsdthread_terminate 361
+#define SYS_kqueue 362
+#define SYS_kevent 363
+#define SYS_lchown 364
+/* 365 old stack_snapshot */
+#define SYS_bsdthread_register 366
+#define SYS_workq_open 367
+#define SYS_workq_kernreturn 368
+#define SYS_kevent64 369
+/* 370 old __semwait_signal */
+/* 371 old __semwait_signal */
+#define SYS_thread_selfid 372
+#define SYS_ledger 373
+#define SYS_kevent_qos 374
+#define SYS_kevent_id 375
+/* 376 */
+/* 377 */
+/* 378 */
+/* 379 */
+#define SYS___mac_execve 380
+#define SYS___mac_syscall 381
+#define SYS___mac_get_file 382
+#define SYS___mac_set_file 383
+#define SYS___mac_get_link 384
+#define SYS___mac_set_link 385
+#define SYS___mac_get_proc 386
+#define SYS___mac_set_proc 387
+#define SYS___mac_get_fd 388
+#define SYS___mac_set_fd 389
+#define SYS___mac_get_pid 390
+/* 391 */
+/* 392 */
+/* 393 */
+#define SYS_pselect 394
+#define SYS_pselect_nocancel 395
+#define SYS_read_nocancel 396
+#define SYS_write_nocancel 397
+#define SYS_open_nocancel 398
+#define SYS_close_nocancel 399
+#define SYS_wait4_nocancel 400
+#define SYS_recvmsg_nocancel 401
+#define SYS_sendmsg_nocancel 402
+#define SYS_recvfrom_nocancel 403
+#define SYS_accept_nocancel 404
+#define SYS_msync_nocancel 405
+#define SYS_fcntl_nocancel 406
+#define SYS_select_nocancel 407
+#define SYS_fsync_nocancel 408
+#define SYS_connect_nocancel 409
+#define SYS_sigsuspend_nocancel 410
+#define SYS_readv_nocancel 411
+#define SYS_writev_nocancel 412
+#define SYS_sendto_nocancel 413
+#define SYS_pread_nocancel 414
+#define SYS_pwrite_nocancel 415
+#define SYS_waitid_nocancel 416
+#define SYS_poll_nocancel 417
+#define SYS_msgsnd_nocancel 418
+#define SYS_msgrcv_nocancel 419
+#define SYS_sem_wait_nocancel 420
+#define SYS_aio_suspend_nocancel 421
+#define SYS___sigwait_nocancel 422
+#define SYS___semwait_signal_nocancel 423
+#define SYS___mac_mount 424
+#define SYS___mac_get_mount 425
+#define SYS___mac_getfsstat 426
+#define SYS_fsgetpath 427
+#define SYS_audit_session_self 428
+#define SYS_audit_session_join 429
+#define SYS_fileport_makeport 430
+#define SYS_fileport_makefd 431
+#define SYS_audit_session_port 432
+#define SYS_pid_suspend 433
+#define SYS_pid_resume 434
+#define SYS_pid_hibernate 435
+#define SYS_pid_shutdown_sockets 436
+/* 437 old shared_region_slide_np */
+/* 438 old shared_region_map_and_slide_np */
+#define SYS_kas_info 439
+#define SYS_memorystatus_control 440
+#define SYS_guarded_open_np 441
+#define SYS_guarded_close_np 442
+#define SYS_guarded_kqueue_np 443
+#define SYS_change_fdguard_np 444
+#define SYS_usrctl 445
+#define SYS_proc_rlimit_control 446
+#define SYS_connectx 447
+#define SYS_disconnectx 448
+#define SYS_peeloff 449
+#define SYS_socket_delegate 450
+#define SYS_telemetry 451
+#define SYS_proc_uuid_policy 452
+#define SYS_memorystatus_get_level 453
+#define SYS_system_override 454
+#define SYS_vfs_purge 455
+#define SYS_sfi_ctl 456
+#define SYS_sfi_pidctl 457
+#define SYS_coalition 458
+#define SYS_coalition_info 459
+#define SYS_necp_match_policy 460
+#define SYS_getattrlistbulk 461
+#define SYS_clonefileat 462
+#define SYS_openat 463
+#define SYS_openat_nocancel 464
+#define SYS_renameat 465
+#define SYS_faccessat 466
+#define SYS_fchmodat 467
+#define SYS_fchownat 468
+#define SYS_fstatat 469
+#define SYS_fstatat64 470
+#define SYS_linkat 471
+#define SYS_unlinkat 472
+#define SYS_readlinkat 473
+#define SYS_symlinkat 474
+#define SYS_mkdirat 475
+#define SYS_getattrlistat 476
+#define SYS_proc_trace_log 477
+#define SYS_bsdthread_ctl 478
+#define SYS_openbyid_np 479
+#define SYS_recvmsg_x 480
+#define SYS_sendmsg_x 481
+#define SYS_thread_selfusage 482
+#define SYS_csrctl 483
+#define SYS_guarded_open_dprotected_np 484
+#define SYS_guarded_write_np 485
+#define SYS_guarded_pwrite_np 486
+#define SYS_guarded_writev_np 487
+#define SYS_renameatx_np 488
+#define SYS_mremap_encrypted 489
+#define SYS_netagent_trigger 490
+#define SYS_stack_snapshot_with_config 491
+#define SYS_microstackshot 492
+#define SYS_grab_pgo_data 493
+#define SYS_persona 494
+/* 495 */
+#define SYS_mach_eventlink_signal 496
+#define SYS_mach_eventlink_wait_until 497
+#define SYS_mach_eventlink_signal_wait_until 498
+#define SYS_work_interval_ctl 499
+#define SYS_getentropy 500
+#define SYS_necp_open 501
+#define SYS_necp_client_action 502
+#define SYS___nexus_open 503
+#define SYS___nexus_register 504
+#define SYS___nexus_deregister 505
+#define SYS___nexus_create 506
+#define SYS___nexus_destroy 507
+#define SYS___nexus_get_opt 508
+#define SYS___nexus_set_opt 509
+#define SYS___channel_open 510
+#define SYS___channel_get_info 511
+#define SYS___channel_sync 512
+#define SYS___channel_get_opt 513
+#define SYS___channel_set_opt 514
+#define SYS_ulock_wait 515
+#define SYS_ulock_wake 516
+#define SYS_fclonefileat 517
+#define SYS_fs_snapshot 518
+#define SYS_register_uexc_handler 519
+#define SYS_terminate_with_payload 520
+#define SYS_abort_with_payload 521
+#define SYS_necp_session_open 522
+#define SYS_necp_session_action 523
+#define SYS_setattrlistat 524
+#define SYS_net_qos_guideline 525
+#define SYS_fmount 526
+#define SYS_ntp_adjtime 527
+#define SYS_ntp_gettime 528
+#define SYS_os_fault_with_payload 529
+#define SYS_kqueue_workloop_ctl 530
+#define SYS___mach_bridge_remote_time 531
+#define SYS_coalition_ledger 532
+#define SYS_log_data 533
+#define SYS_memorystatus_available_memory 534
+#define SYS_objc_bp_assist_cfg_np 535
+#define SYS_shared_region_map_and_slide_2_np 536
+#define SYS_pivot_root 537
+#define SYS_task_inspect_for_pid 538
+#define SYS_task_read_for_pid 539
+#define SYS_preadv 540
+#define SYS_pwritev 541
+#define SYS_preadv_nocancel 542
+#define SYS_pwritev_nocancel 543
+#define SYS_ulock_wait2 544
+#define SYS_proc_info_extended_id 545
+#define SYS_tracker_action 546
+#define SYS_debug_syscall_reject 547
+#define SYS_debug_syscall_reject_config 548
+#define SYS_graftdmg 549
+#define SYS_map_with_linking_np 550
+#define SYS_freadlink 551
+#define SYS_record_system_event 552
+#define SYS_mkfifoat 553
+#define SYS_mknodat 554
+#define SYS_ungraftdmg 555
+#define SYS_coalition_policy_set 556
+#define SYS_coalition_policy_get 557
+#define SYS_MAXSYSCALL 558
+#define SYS_invalid 63
+
#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H
>From 0bba8519a4773a3f2fbb27b02758b3ae3acb614d Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Wed, 5 Nov 2025 12:00:29 +0530
Subject: [PATCH 05/15] [libc] add reference for syscall numbers
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/src/__support/OSUtil/darwin/aarch64/syscall.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
index 6cbbd11a79ae3..3286e006535df 100644
--- a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
+++ b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
@@ -110,6 +110,14 @@ LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
#undef REGISTER_CONSTRAINT_5
#undef REGISTER_CONSTRAINT_6
+/* Following has been copied from MacOSX15.5 sdk
+ * This has been referenced from and generated by the syscalls.master file
+ * that can be found
+ * https://github.com/apple-oss-distributions/xnu/blob/f6217f891ac0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/syscalls.master
+ */
+
+/* SYSCALL NUMBERS START */
+
#define SYS_syscall 0
#define SYS_exit 1
#define SYS_fork 2
@@ -671,4 +679,6 @@ LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
#define SYS_MAXSYSCALL 558
#define SYS_invalid 63
+/* SYSCALL NUMBERS END */
+
#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H
>From b0ab2867029aa781c2e758ef39e7b49d948b4651 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Fri, 7 Nov 2025 01:35:11 +0530
Subject: [PATCH 06/15] [libc] use syscall.h
---
.../__support/OSUtil/darwin/aarch64/syscall.h | 1121 +++++++++--------
1 file changed, 561 insertions(+), 560 deletions(-)
diff --git a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
index 3286e006535df..2e9f1759df85a 100644
--- a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
+++ b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
@@ -118,566 +118,567 @@ LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
/* SYSCALL NUMBERS START */
-#define SYS_syscall 0
-#define SYS_exit 1
-#define SYS_fork 2
-#define SYS_read 3
-#define SYS_write 4
-#define SYS_open 5
-#define SYS_close 6
-#define SYS_wait4 7
-/* 8 old creat */
-#define SYS_link 9
-#define SYS_unlink 10
-/* 11 old execv */
-#define SYS_chdir 12
-#define SYS_fchdir 13
-#define SYS_mknod 14
-#define SYS_chmod 15
-#define SYS_chown 16
-/* 17 old break */
-#define SYS_getfsstat 18
-/* 19 old lseek */
-#define SYS_getpid 20
-/* 21 old mount */
-/* 22 old umount */
-#define SYS_setuid 23
-#define SYS_getuid 24
-#define SYS_geteuid 25
-#define SYS_ptrace 26
-#define SYS_recvmsg 27
-#define SYS_sendmsg 28
-#define SYS_recvfrom 29
-#define SYS_accept 30
-#define SYS_getpeername 31
-#define SYS_getsockname 32
-#define SYS_access 33
-#define SYS_chflags 34
-#define SYS_fchflags 35
-#define SYS_sync 36
-#define SYS_kill 37
-#define SYS_crossarch_trap 38
-#define SYS_getppid 39
-/* 40 old lstat */
-#define SYS_dup 41
-#define SYS_pipe 42
-#define SYS_getegid 43
-/* 44 old profil */
-/* 45 old ktrace */
-#define SYS_sigaction 46
-#define SYS_getgid 47
-#define SYS_sigprocmask 48
-#define SYS_getlogin 49
-#define SYS_setlogin 50
-#define SYS_acct 51
-#define SYS_sigpending 52
-#define SYS_sigaltstack 53
-#define SYS_ioctl 54
-#define SYS_reboot 55
-#define SYS_revoke 56
-#define SYS_symlink 57
-#define SYS_readlink 58
-#define SYS_execve 59
-#define SYS_umask 60
-#define SYS_chroot 61
-/* 62 old fstat */
-/* 63 used internally and reserved */
-/* 64 old getpagesize */
-#define SYS_msync 65
-#define SYS_vfork 66
-#define SYS_oslog_coproc_reg 67
-#define SYS_oslog_coproc 68
-/* 69 old sbrk */
-/* 70 old sstk */
-/* 71 old mmap */
-/* 72 old vadvise */
-#define SYS_munmap 73
-#define SYS_mprotect 74
-#define SYS_madvise 75
-/* 76 old vhangup */
-/* 77 old vlimit */
-#define SYS_mincore 78
-#define SYS_getgroups 79
-#define SYS_setgroups 80
-#define SYS_getpgrp 81
-#define SYS_setpgid 82
-#define SYS_setitimer 83
-/* 84 old wait */
-#define SYS_swapon 85
-#define SYS_getitimer 86
-/* 87 old gethostname */
-/* 88 old sethostname */
-#define SYS_getdtablesize 89
-#define SYS_dup2 90
-/* 91 old getdopt */
-#define SYS_fcntl 92
-#define SYS_select 93
-/* 94 old setdopt */
-#define SYS_fsync 95
-#define SYS_setpriority 96
-#define SYS_socket 97
-#define SYS_connect 98
-/* 99 old accept */
-#define SYS_getpriority 100
-/* 101 old send */
-/* 102 old recv */
-/* 103 old sigreturn */
-#define SYS_bind 104
-#define SYS_setsockopt 105
-#define SYS_listen 106
-/* 107 old vtimes */
-/* 108 old sigvec */
-/* 109 old sigblock */
-/* 110 old sigsetmask */
-#define SYS_sigsuspend 111
-/* 112 old sigstack */
-/* 113 old recvmsg */
-/* 114 old sendmsg */
-/* 115 old vtrace */
-#define SYS_gettimeofday 116
-#define SYS_getrusage 117
-#define SYS_getsockopt 118
-/* 119 old resuba */
-#define SYS_readv 120
-#define SYS_writev 121
-#define SYS_settimeofday 122
-#define SYS_fchown 123
-#define SYS_fchmod 124
-/* 125 old recvfrom */
-#define SYS_setreuid 126
-#define SYS_setregid 127
-#define SYS_rename 128
-/* 129 old truncate */
-/* 130 old ftruncate */
-#define SYS_flock 131
-#define SYS_mkfifo 132
-#define SYS_sendto 133
-#define SYS_shutdown 134
-#define SYS_socketpair 135
-#define SYS_mkdir 136
-#define SYS_rmdir 137
-#define SYS_utimes 138
-#define SYS_futimes 139
-#define SYS_adjtime 140
-/* 141 old getpeername */
-#define SYS_gethostuuid 142
-/* 143 old sethostid */
-/* 144 old getrlimit */
-/* 145 old setrlimit */
-/* 146 old killpg */
-#define SYS_setsid 147
-/* 148 old setquota */
-/* 149 old qquota */
-/* 150 old getsockname */
-#define SYS_getpgid 151
-#define SYS_setprivexec 152
-#define SYS_pread 153
-#define SYS_pwrite 154
-#define SYS_nfssvc 155
-/* 156 old getdirentries */
-#define SYS_statfs 157
-#define SYS_fstatfs 158
-#define SYS_unmount 159
-/* 160 old async_daemon */
-#define SYS_getfh 161
-/* 162 old getdomainname */
-/* 163 old setdomainname */
-/* 164 */
-#define SYS_quotactl 165
-/* 166 old exportfs */
-#define SYS_mount 167
-/* 168 old ustat */
-#define SYS_csops 169
-#define SYS_csops_audittoken 170
-/* 171 old wait3 */
-/* 172 old rpause */
-#define SYS_waitid 173
-/* 174 old getdents */
-/* 175 old gc_control */
-/* 176 old add_profil */
-#define SYS_kdebug_typefilter 177
-#define SYS_kdebug_trace_string 178
-#define SYS_kdebug_trace64 179
-#define SYS_kdebug_trace 180
-#define SYS_setgid 181
-#define SYS_setegid 182
-#define SYS_seteuid 183
-#define SYS_sigreturn 184
-#define SYS_panic_with_data 185
-#define SYS_thread_selfcounts 186
-#define SYS_fdatasync 187
-#define SYS_stat 188
-#define SYS_fstat 189
-#define SYS_lstat 190
-#define SYS_pathconf 191
-#define SYS_fpathconf 192
-/* 193 old getfsstat */
-#define SYS_getrlimit 194
-#define SYS_setrlimit 195
-#define SYS_getdirentries 196
-#define SYS_mmap 197
-/* 198 old __syscall */
-#define SYS_lseek 199
-#define SYS_truncate 200
-#define SYS_ftruncate 201
-#define SYS_sysctl 202
-#define SYS_mlock 203
-#define SYS_munlock 204
-#define SYS_undelete 205
-/* 206 old ATsocket */
-/* 207 old ATgetmsg */
-/* 208 old ATputmsg */
-/* 209 old ATsndreq */
-/* 210 old ATsndrsp */
-/* 211 old ATgetreq */
-/* 212 old ATgetrsp */
-/* 213 Reserved for AppleTalk */
-/* 214 */
-/* 215 */
-#define SYS_open_dprotected_np 216
-#define SYS_fsgetpath_ext 217
-#define SYS_openat_dprotected_np 218
-/* 219 old fstatv */
-#define SYS_getattrlist 220
-#define SYS_setattrlist 221
-#define SYS_getdirentriesattr 222
-#define SYS_exchangedata 223
-/* 224 old checkuseraccess or fsgetpath */
-#define SYS_searchfs 225
-#define SYS_delete 226
-#define SYS_copyfile 227
-#define SYS_fgetattrlist 228
-#define SYS_fsetattrlist 229
-#define SYS_poll 230
-/* 231 old watchevent */
-/* 232 old waitevent */
-/* 233 old modwatch */
-#define SYS_getxattr 234
-#define SYS_fgetxattr 235
-#define SYS_setxattr 236
-#define SYS_fsetxattr 237
-#define SYS_removexattr 238
-#define SYS_fremovexattr 239
-#define SYS_listxattr 240
-#define SYS_flistxattr 241
-#define SYS_fsctl 242
-#define SYS_initgroups 243
-#define SYS_posix_spawn 244
-#define SYS_ffsctl 245
-/* 246 */
-/* 247 old nfsclnt */
-#define SYS_fhopen 248
-/* 249 */
-#define SYS_minherit 250
-#define SYS_semsys 251
-#define SYS_msgsys 252
-#define SYS_shmsys 253
-#define SYS_semctl 254
-#define SYS_semget 255
-#define SYS_semop 256
-/* 257 old semconfig */
-#define SYS_msgctl 258
-#define SYS_msgget 259
-#define SYS_msgsnd 260
-#define SYS_msgrcv 261
-#define SYS_shmat 262
-#define SYS_shmctl 263
-#define SYS_shmdt 264
-#define SYS_shmget 265
-#define SYS_shm_open 266
-#define SYS_shm_unlink 267
-#define SYS_sem_open 268
-#define SYS_sem_close 269
-#define SYS_sem_unlink 270
-#define SYS_sem_wait 271
-#define SYS_sem_trywait 272
-#define SYS_sem_post 273
-#define SYS_sysctlbyname 274
-/* 275 old sem_init */
-/* 276 old sem_destroy */
-#define SYS_open_extended 277
-#define SYS_umask_extended 278
-#define SYS_stat_extended 279
-#define SYS_lstat_extended 280
-#define SYS_fstat_extended 281
-#define SYS_chmod_extended 282
-#define SYS_fchmod_extended 283
-#define SYS_access_extended 284
-#define SYS_settid 285
-#define SYS_gettid 286
-#define SYS_setsgroups 287
-#define SYS_getsgroups 288
-#define SYS_setwgroups 289
-#define SYS_getwgroups 290
-#define SYS_mkfifo_extended 291
-#define SYS_mkdir_extended 292
-#define SYS_identitysvc 293
-#define SYS_shared_region_check_np 294
-/* 295 old shared_region_map_np */
-#define SYS_vm_pressure_monitor 296
-#define SYS_psynch_rw_longrdlock 297
-#define SYS_psynch_rw_yieldwrlock 298
-#define SYS_psynch_rw_downgrade 299
-#define SYS_psynch_rw_upgrade 300
-#define SYS_psynch_mutexwait 301
-#define SYS_psynch_mutexdrop 302
-#define SYS_psynch_cvbroad 303
-#define SYS_psynch_cvsignal 304
-#define SYS_psynch_cvwait 305
-#define SYS_psynch_rw_rdlock 306
-#define SYS_psynch_rw_wrlock 307
-#define SYS_psynch_rw_unlock 308
-#define SYS_psynch_rw_unlock2 309
-#define SYS_getsid 310
-#define SYS_settid_with_pid 311
-#define SYS_psynch_cvclrprepost 312
-#define SYS_aio_fsync 313
-#define SYS_aio_return 314
-#define SYS_aio_suspend 315
-#define SYS_aio_cancel 316
-#define SYS_aio_error 317
-#define SYS_aio_read 318
-#define SYS_aio_write 319
-#define SYS_lio_listio 320
-/* 321 old __pthread_cond_wait */
-#define SYS_iopolicysys 322
-#define SYS_process_policy 323
-#define SYS_mlockall 324
-#define SYS_munlockall 325
-/* 326 */
-#define SYS_issetugid 327
-#define SYS___pthread_kill 328
-#define SYS___pthread_sigmask 329
-#define SYS___sigwait 330
-#define SYS___disable_threadsignal 331
-#define SYS___pthread_markcancel 332
-#define SYS___pthread_canceled 333
-#define SYS___semwait_signal 334
-/* 335 old utrace */
-#define SYS_proc_info 336
-#define SYS_sendfile 337
-#define SYS_stat64 338
-#define SYS_fstat64 339
-#define SYS_lstat64 340
-#define SYS_stat64_extended 341
-#define SYS_lstat64_extended 342
-#define SYS_fstat64_extended 343
-#define SYS_getdirentries64 344
-#define SYS_statfs64 345
-#define SYS_fstatfs64 346
-#define SYS_getfsstat64 347
-#define SYS___pthread_chdir 348
-#define SYS___pthread_fchdir 349
-#define SYS_audit 350
-#define SYS_auditon 351
-/* 352 */
-#define SYS_getauid 353
-#define SYS_setauid 354
-/* 355 old getaudit */
-/* 356 old setaudit */
-#define SYS_getaudit_addr 357
-#define SYS_setaudit_addr 358
-#define SYS_auditctl 359
-#define SYS_bsdthread_create 360
-#define SYS_bsdthread_terminate 361
-#define SYS_kqueue 362
-#define SYS_kevent 363
-#define SYS_lchown 364
-/* 365 old stack_snapshot */
-#define SYS_bsdthread_register 366
-#define SYS_workq_open 367
-#define SYS_workq_kernreturn 368
-#define SYS_kevent64 369
-/* 370 old __semwait_signal */
-/* 371 old __semwait_signal */
-#define SYS_thread_selfid 372
-#define SYS_ledger 373
-#define SYS_kevent_qos 374
-#define SYS_kevent_id 375
-/* 376 */
-/* 377 */
-/* 378 */
-/* 379 */
-#define SYS___mac_execve 380
-#define SYS___mac_syscall 381
-#define SYS___mac_get_file 382
-#define SYS___mac_set_file 383
-#define SYS___mac_get_link 384
-#define SYS___mac_set_link 385
-#define SYS___mac_get_proc 386
-#define SYS___mac_set_proc 387
-#define SYS___mac_get_fd 388
-#define SYS___mac_set_fd 389
-#define SYS___mac_get_pid 390
-/* 391 */
-/* 392 */
-/* 393 */
-#define SYS_pselect 394
-#define SYS_pselect_nocancel 395
-#define SYS_read_nocancel 396
-#define SYS_write_nocancel 397
-#define SYS_open_nocancel 398
-#define SYS_close_nocancel 399
-#define SYS_wait4_nocancel 400
-#define SYS_recvmsg_nocancel 401
-#define SYS_sendmsg_nocancel 402
-#define SYS_recvfrom_nocancel 403
-#define SYS_accept_nocancel 404
-#define SYS_msync_nocancel 405
-#define SYS_fcntl_nocancel 406
-#define SYS_select_nocancel 407
-#define SYS_fsync_nocancel 408
-#define SYS_connect_nocancel 409
-#define SYS_sigsuspend_nocancel 410
-#define SYS_readv_nocancel 411
-#define SYS_writev_nocancel 412
-#define SYS_sendto_nocancel 413
-#define SYS_pread_nocancel 414
-#define SYS_pwrite_nocancel 415
-#define SYS_waitid_nocancel 416
-#define SYS_poll_nocancel 417
-#define SYS_msgsnd_nocancel 418
-#define SYS_msgrcv_nocancel 419
-#define SYS_sem_wait_nocancel 420
-#define SYS_aio_suspend_nocancel 421
-#define SYS___sigwait_nocancel 422
-#define SYS___semwait_signal_nocancel 423
-#define SYS___mac_mount 424
-#define SYS___mac_get_mount 425
-#define SYS___mac_getfsstat 426
-#define SYS_fsgetpath 427
-#define SYS_audit_session_self 428
-#define SYS_audit_session_join 429
-#define SYS_fileport_makeport 430
-#define SYS_fileport_makefd 431
-#define SYS_audit_session_port 432
-#define SYS_pid_suspend 433
-#define SYS_pid_resume 434
-#define SYS_pid_hibernate 435
-#define SYS_pid_shutdown_sockets 436
-/* 437 old shared_region_slide_np */
-/* 438 old shared_region_map_and_slide_np */
-#define SYS_kas_info 439
-#define SYS_memorystatus_control 440
-#define SYS_guarded_open_np 441
-#define SYS_guarded_close_np 442
-#define SYS_guarded_kqueue_np 443
-#define SYS_change_fdguard_np 444
-#define SYS_usrctl 445
-#define SYS_proc_rlimit_control 446
-#define SYS_connectx 447
-#define SYS_disconnectx 448
-#define SYS_peeloff 449
-#define SYS_socket_delegate 450
-#define SYS_telemetry 451
-#define SYS_proc_uuid_policy 452
-#define SYS_memorystatus_get_level 453
-#define SYS_system_override 454
-#define SYS_vfs_purge 455
-#define SYS_sfi_ctl 456
-#define SYS_sfi_pidctl 457
-#define SYS_coalition 458
-#define SYS_coalition_info 459
-#define SYS_necp_match_policy 460
-#define SYS_getattrlistbulk 461
-#define SYS_clonefileat 462
-#define SYS_openat 463
-#define SYS_openat_nocancel 464
-#define SYS_renameat 465
-#define SYS_faccessat 466
-#define SYS_fchmodat 467
-#define SYS_fchownat 468
-#define SYS_fstatat 469
-#define SYS_fstatat64 470
-#define SYS_linkat 471
-#define SYS_unlinkat 472
-#define SYS_readlinkat 473
-#define SYS_symlinkat 474
-#define SYS_mkdirat 475
-#define SYS_getattrlistat 476
-#define SYS_proc_trace_log 477
-#define SYS_bsdthread_ctl 478
-#define SYS_openbyid_np 479
-#define SYS_recvmsg_x 480
-#define SYS_sendmsg_x 481
-#define SYS_thread_selfusage 482
-#define SYS_csrctl 483
-#define SYS_guarded_open_dprotected_np 484
-#define SYS_guarded_write_np 485
-#define SYS_guarded_pwrite_np 486
-#define SYS_guarded_writev_np 487
-#define SYS_renameatx_np 488
-#define SYS_mremap_encrypted 489
-#define SYS_netagent_trigger 490
-#define SYS_stack_snapshot_with_config 491
-#define SYS_microstackshot 492
-#define SYS_grab_pgo_data 493
-#define SYS_persona 494
-/* 495 */
-#define SYS_mach_eventlink_signal 496
-#define SYS_mach_eventlink_wait_until 497
-#define SYS_mach_eventlink_signal_wait_until 498
-#define SYS_work_interval_ctl 499
-#define SYS_getentropy 500
-#define SYS_necp_open 501
-#define SYS_necp_client_action 502
-#define SYS___nexus_open 503
-#define SYS___nexus_register 504
-#define SYS___nexus_deregister 505
-#define SYS___nexus_create 506
-#define SYS___nexus_destroy 507
-#define SYS___nexus_get_opt 508
-#define SYS___nexus_set_opt 509
-#define SYS___channel_open 510
-#define SYS___channel_get_info 511
-#define SYS___channel_sync 512
-#define SYS___channel_get_opt 513
-#define SYS___channel_set_opt 514
-#define SYS_ulock_wait 515
-#define SYS_ulock_wake 516
-#define SYS_fclonefileat 517
-#define SYS_fs_snapshot 518
-#define SYS_register_uexc_handler 519
-#define SYS_terminate_with_payload 520
-#define SYS_abort_with_payload 521
-#define SYS_necp_session_open 522
-#define SYS_necp_session_action 523
-#define SYS_setattrlistat 524
-#define SYS_net_qos_guideline 525
-#define SYS_fmount 526
-#define SYS_ntp_adjtime 527
-#define SYS_ntp_gettime 528
-#define SYS_os_fault_with_payload 529
-#define SYS_kqueue_workloop_ctl 530
-#define SYS___mach_bridge_remote_time 531
-#define SYS_coalition_ledger 532
-#define SYS_log_data 533
-#define SYS_memorystatus_available_memory 534
-#define SYS_objc_bp_assist_cfg_np 535
-#define SYS_shared_region_map_and_slide_2_np 536
-#define SYS_pivot_root 537
-#define SYS_task_inspect_for_pid 538
-#define SYS_task_read_for_pid 539
-#define SYS_preadv 540
-#define SYS_pwritev 541
-#define SYS_preadv_nocancel 542
-#define SYS_pwritev_nocancel 543
-#define SYS_ulock_wait2 544
-#define SYS_proc_info_extended_id 545
-#define SYS_tracker_action 546
-#define SYS_debug_syscall_reject 547
-#define SYS_debug_syscall_reject_config 548
-#define SYS_graftdmg 549
-#define SYS_map_with_linking_np 550
-#define SYS_freadlink 551
-#define SYS_record_system_event 552
-#define SYS_mkfifoat 553
-#define SYS_mknodat 554
-#define SYS_ungraftdmg 555
-#define SYS_coalition_policy_set 556
-#define SYS_coalition_policy_get 557
-#define SYS_MAXSYSCALL 558
-#define SYS_invalid 63
+#include <sys/syscall.h>
+// #define SYS_syscall 0
+// #define SYS_exit 1
+// #define SYS_fork 2
+// #define SYS_read 3
+// #define SYS_write 4
+// #define SYS_open 5
+// #define SYS_close 6
+// #define SYS_wait4 7
+///* 8 old creat */
+// #define SYS_link 9
+// #define SYS_unlink 10
+///* 11 old execv */
+// #define SYS_chdir 12
+// #define SYS_fchdir 13
+// #define SYS_mknod 14
+// #define SYS_chmod 15
+// #define SYS_chown 16
+///* 17 old break */
+// #define SYS_getfsstat 18
+///* 19 old lseek */
+// #define SYS_getpid 20
+///* 21 old mount */
+///* 22 old umount */
+// #define SYS_setuid 23
+// #define SYS_getuid 24
+// #define SYS_geteuid 25
+// #define SYS_ptrace 26
+// #define SYS_recvmsg 27
+// #define SYS_sendmsg 28
+// #define SYS_recvfrom 29
+// #define SYS_accept 30
+// #define SYS_getpeername 31
+// #define SYS_getsockname 32
+// #define SYS_access 33
+// #define SYS_chflags 34
+// #define SYS_fchflags 35
+// #define SYS_sync 36
+// #define SYS_kill 37
+// #define SYS_crossarch_trap 38
+// #define SYS_getppid 39
+///* 40 old lstat */
+// #define SYS_dup 41
+// #define SYS_pipe 42
+// #define SYS_getegid 43
+///* 44 old profil */
+///* 45 old ktrace */
+// #define SYS_sigaction 46
+// #define SYS_getgid 47
+// #define SYS_sigprocmask 48
+// #define SYS_getlogin 49
+// #define SYS_setlogin 50
+// #define SYS_acct 51
+// #define SYS_sigpending 52
+// #define SYS_sigaltstack 53
+// #define SYS_ioctl 54
+// #define SYS_reboot 55
+// #define SYS_revoke 56
+// #define SYS_symlink 57
+// #define SYS_readlink 58
+// #define SYS_execve 59
+// #define SYS_umask 60
+// #define SYS_chroot 61
+///* 62 old fstat */
+///* 63 used internally and reserved */
+///* 64 old getpagesize */
+// #define SYS_msync 65
+// #define SYS_vfork 66
+// #define SYS_oslog_coproc_reg 67
+// #define SYS_oslog_coproc 68
+///* 69 old sbrk */
+///* 70 old sstk */
+///* 71 old mmap */
+///* 72 old vadvise */
+// #define SYS_munmap 73
+// #define SYS_mprotect 74
+// #define SYS_madvise 75
+///* 76 old vhangup */
+///* 77 old vlimit */
+// #define SYS_mincore 78
+// #define SYS_getgroups 79
+// #define SYS_setgroups 80
+// #define SYS_getpgrp 81
+// #define SYS_setpgid 82
+// #define SYS_setitimer 83
+///* 84 old wait */
+// #define SYS_swapon 85
+// #define SYS_getitimer 86
+///* 87 old gethostname */
+///* 88 old sethostname */
+// #define SYS_getdtablesize 89
+// #define SYS_dup2 90
+///* 91 old getdopt */
+// #define SYS_fcntl 92
+// #define SYS_select 93
+///* 94 old setdopt */
+// #define SYS_fsync 95
+// #define SYS_setpriority 96
+// #define SYS_socket 97
+// #define SYS_connect 98
+///* 99 old accept */
+// #define SYS_getpriority 100
+///* 101 old send */
+///* 102 old recv */
+///* 103 old sigreturn */
+// #define SYS_bind 104
+// #define SYS_setsockopt 105
+// #define SYS_listen 106
+///* 107 old vtimes */
+///* 108 old sigvec */
+///* 109 old sigblock */
+///* 110 old sigsetmask */
+// #define SYS_sigsuspend 111
+///* 112 old sigstack */
+///* 113 old recvmsg */
+///* 114 old sendmsg */
+///* 115 old vtrace */
+// #define SYS_gettimeofday 116
+// #define SYS_getrusage 117
+// #define SYS_getsockopt 118
+///* 119 old resuba */
+// #define SYS_readv 120
+// #define SYS_writev 121
+// #define SYS_settimeofday 122
+// #define SYS_fchown 123
+// #define SYS_fchmod 124
+///* 125 old recvfrom */
+// #define SYS_setreuid 126
+// #define SYS_setregid 127
+// #define SYS_rename 128
+///* 129 old truncate */
+///* 130 old ftruncate */
+// #define SYS_flock 131
+// #define SYS_mkfifo 132
+// #define SYS_sendto 133
+// #define SYS_shutdown 134
+// #define SYS_socketpair 135
+// #define SYS_mkdir 136
+// #define SYS_rmdir 137
+// #define SYS_utimes 138
+// #define SYS_futimes 139
+// #define SYS_adjtime 140
+///* 141 old getpeername */
+// #define SYS_gethostuuid 142
+///* 143 old sethostid */
+///* 144 old getrlimit */
+///* 145 old setrlimit */
+///* 146 old killpg */
+// #define SYS_setsid 147
+///* 148 old setquota */
+///* 149 old qquota */
+///* 150 old getsockname */
+// #define SYS_getpgid 151
+// #define SYS_setprivexec 152
+// #define SYS_pread 153
+// #define SYS_pwrite 154
+// #define SYS_nfssvc 155
+///* 156 old getdirentries */
+// #define SYS_statfs 157
+// #define SYS_fstatfs 158
+// #define SYS_unmount 159
+///* 160 old async_daemon */
+// #define SYS_getfh 161
+///* 162 old getdomainname */
+///* 163 old setdomainname */
+///* 164 */
+// #define SYS_quotactl 165
+///* 166 old exportfs */
+// #define SYS_mount 167
+///* 168 old ustat */
+// #define SYS_csops 169
+// #define SYS_csops_audittoken 170
+///* 171 old wait3 */
+///* 172 old rpause */
+// #define SYS_waitid 173
+///* 174 old getdents */
+///* 175 old gc_control */
+///* 176 old add_profil */
+// #define SYS_kdebug_typefilter 177
+// #define SYS_kdebug_trace_string 178
+// #define SYS_kdebug_trace64 179
+// #define SYS_kdebug_trace 180
+// #define SYS_setgid 181
+// #define SYS_setegid 182
+// #define SYS_seteuid 183
+// #define SYS_sigreturn 184
+// #define SYS_panic_with_data 185
+// #define SYS_thread_selfcounts 186
+// #define SYS_fdatasync 187
+// #define SYS_stat 188
+// #define SYS_fstat 189
+// #define SYS_lstat 190
+// #define SYS_pathconf 191
+// #define SYS_fpathconf 192
+///* 193 old getfsstat */
+// #define SYS_getrlimit 194
+// #define SYS_setrlimit 195
+// #define SYS_getdirentries 196
+// #define SYS_mmap 197
+///* 198 old __syscall */
+// #define SYS_lseek 199
+// #define SYS_truncate 200
+// #define SYS_ftruncate 201
+// #define SYS_sysctl 202
+// #define SYS_mlock 203
+// #define SYS_munlock 204
+// #define SYS_undelete 205
+///* 206 old ATsocket */
+///* 207 old ATgetmsg */
+///* 208 old ATputmsg */
+///* 209 old ATsndreq */
+///* 210 old ATsndrsp */
+///* 211 old ATgetreq */
+///* 212 old ATgetrsp */
+///* 213 Reserved for AppleTalk */
+///* 214 */
+///* 215 */
+// #define SYS_open_dprotected_np 216
+// #define SYS_fsgetpath_ext 217
+// #define SYS_openat_dprotected_np 218
+///* 219 old fstatv */
+// #define SYS_getattrlist 220
+// #define SYS_setattrlist 221
+// #define SYS_getdirentriesattr 222
+// #define SYS_exchangedata 223
+///* 224 old checkuseraccess or fsgetpath */
+// #define SYS_searchfs 225
+// #define SYS_delete 226
+// #define SYS_copyfile 227
+// #define SYS_fgetattrlist 228
+// #define SYS_fsetattrlist 229
+// #define SYS_poll 230
+///* 231 old watchevent */
+///* 232 old waitevent */
+///* 233 old modwatch */
+// #define SYS_getxattr 234
+// #define SYS_fgetxattr 235
+// #define SYS_setxattr 236
+// #define SYS_fsetxattr 237
+// #define SYS_removexattr 238
+// #define SYS_fremovexattr 239
+// #define SYS_listxattr 240
+// #define SYS_flistxattr 241
+// #define SYS_fsctl 242
+// #define SYS_initgroups 243
+// #define SYS_posix_spawn 244
+// #define SYS_ffsctl 245
+///* 246 */
+///* 247 old nfsclnt */
+// #define SYS_fhopen 248
+///* 249 */
+// #define SYS_minherit 250
+// #define SYS_semsys 251
+// #define SYS_msgsys 252
+// #define SYS_shmsys 253
+// #define SYS_semctl 254
+// #define SYS_semget 255
+// #define SYS_semop 256
+///* 257 old semconfig */
+// #define SYS_msgctl 258
+// #define SYS_msgget 259
+// #define SYS_msgsnd 260
+// #define SYS_msgrcv 261
+// #define SYS_shmat 262
+// #define SYS_shmctl 263
+// #define SYS_shmdt 264
+// #define SYS_shmget 265
+// #define SYS_shm_open 266
+// #define SYS_shm_unlink 267
+// #define SYS_sem_open 268
+// #define SYS_sem_close 269
+// #define SYS_sem_unlink 270
+// #define SYS_sem_wait 271
+// #define SYS_sem_trywait 272
+// #define SYS_sem_post 273
+// #define SYS_sysctlbyname 274
+///* 275 old sem_init */
+///* 276 old sem_destroy */
+// #define SYS_open_extended 277
+// #define SYS_umask_extended 278
+// #define SYS_stat_extended 279
+// #define SYS_lstat_extended 280
+// #define SYS_fstat_extended 281
+// #define SYS_chmod_extended 282
+// #define SYS_fchmod_extended 283
+// #define SYS_access_extended 284
+// #define SYS_settid 285
+// #define SYS_gettid 286
+// #define SYS_setsgroups 287
+// #define SYS_getsgroups 288
+// #define SYS_setwgroups 289
+// #define SYS_getwgroups 290
+// #define SYS_mkfifo_extended 291
+// #define SYS_mkdir_extended 292
+// #define SYS_identitysvc 293
+// #define SYS_shared_region_check_np 294
+///* 295 old shared_region_map_np */
+// #define SYS_vm_pressure_monitor 296
+// #define SYS_psynch_rw_longrdlock 297
+// #define SYS_psynch_rw_yieldwrlock 298
+// #define SYS_psynch_rw_downgrade 299
+// #define SYS_psynch_rw_upgrade 300
+// #define SYS_psynch_mutexwait 301
+// #define SYS_psynch_mutexdrop 302
+// #define SYS_psynch_cvbroad 303
+// #define SYS_psynch_cvsignal 304
+// #define SYS_psynch_cvwait 305
+// #define SYS_psynch_rw_rdlock 306
+// #define SYS_psynch_rw_wrlock 307
+// #define SYS_psynch_rw_unlock 308
+// #define SYS_psynch_rw_unlock2 309
+// #define SYS_getsid 310
+// #define SYS_settid_with_pid 311
+// #define SYS_psynch_cvclrprepost 312
+// #define SYS_aio_fsync 313
+// #define SYS_aio_return 314
+// #define SYS_aio_suspend 315
+// #define SYS_aio_cancel 316
+// #define SYS_aio_error 317
+// #define SYS_aio_read 318
+// #define SYS_aio_write 319
+// #define SYS_lio_listio 320
+///* 321 old __pthread_cond_wait */
+// #define SYS_iopolicysys 322
+// #define SYS_process_policy 323
+// #define SYS_mlockall 324
+// #define SYS_munlockall 325
+///* 326 */
+// #define SYS_issetugid 327
+// #define SYS___pthread_kill 328
+// #define SYS___pthread_sigmask 329
+// #define SYS___sigwait 330
+// #define SYS___disable_threadsignal 331
+// #define SYS___pthread_markcancel 332
+// #define SYS___pthread_canceled 333
+// #define SYS___semwait_signal 334
+///* 335 old utrace */
+// #define SYS_proc_info 336
+// #define SYS_sendfile 337
+// #define SYS_stat64 338
+// #define SYS_fstat64 339
+// #define SYS_lstat64 340
+// #define SYS_stat64_extended 341
+// #define SYS_lstat64_extended 342
+// #define SYS_fstat64_extended 343
+// #define SYS_getdirentries64 344
+// #define SYS_statfs64 345
+// #define SYS_fstatfs64 346
+// #define SYS_getfsstat64 347
+// #define SYS___pthread_chdir 348
+// #define SYS___pthread_fchdir 349
+// #define SYS_audit 350
+// #define SYS_auditon 351
+///* 352 */
+// #define SYS_getauid 353
+// #define SYS_setauid 354
+///* 355 old getaudit */
+///* 356 old setaudit */
+// #define SYS_getaudit_addr 357
+// #define SYS_setaudit_addr 358
+// #define SYS_auditctl 359
+// #define SYS_bsdthread_create 360
+// #define SYS_bsdthread_terminate 361
+// #define SYS_kqueue 362
+// #define SYS_kevent 363
+// #define SYS_lchown 364
+///* 365 old stack_snapshot */
+// #define SYS_bsdthread_register 366
+// #define SYS_workq_open 367
+// #define SYS_workq_kernreturn 368
+// #define SYS_kevent64 369
+///* 370 old __semwait_signal */
+///* 371 old __semwait_signal */
+// #define SYS_thread_selfid 372
+// #define SYS_ledger 373
+// #define SYS_kevent_qos 374
+// #define SYS_kevent_id 375
+///* 376 */
+///* 377 */
+///* 378 */
+///* 379 */
+// #define SYS___mac_execve 380
+// #define SYS___mac_syscall 381
+// #define SYS___mac_get_file 382
+// #define SYS___mac_set_file 383
+// #define SYS___mac_get_link 384
+// #define SYS___mac_set_link 385
+// #define SYS___mac_get_proc 386
+// #define SYS___mac_set_proc 387
+// #define SYS___mac_get_fd 388
+// #define SYS___mac_set_fd 389
+// #define SYS___mac_get_pid 390
+///* 391 */
+///* 392 */
+///* 393 */
+// #define SYS_pselect 394
+// #define SYS_pselect_nocancel 395
+// #define SYS_read_nocancel 396
+// #define SYS_write_nocancel 397
+// #define SYS_open_nocancel 398
+// #define SYS_close_nocancel 399
+// #define SYS_wait4_nocancel 400
+// #define SYS_recvmsg_nocancel 401
+// #define SYS_sendmsg_nocancel 402
+// #define SYS_recvfrom_nocancel 403
+// #define SYS_accept_nocancel 404
+// #define SYS_msync_nocancel 405
+// #define SYS_fcntl_nocancel 406
+// #define SYS_select_nocancel 407
+// #define SYS_fsync_nocancel 408
+// #define SYS_connect_nocancel 409
+// #define SYS_sigsuspend_nocancel 410
+// #define SYS_readv_nocancel 411
+// #define SYS_writev_nocancel 412
+// #define SYS_sendto_nocancel 413
+// #define SYS_pread_nocancel 414
+// #define SYS_pwrite_nocancel 415
+// #define SYS_waitid_nocancel 416
+// #define SYS_poll_nocancel 417
+// #define SYS_msgsnd_nocancel 418
+// #define SYS_msgrcv_nocancel 419
+// #define SYS_sem_wait_nocancel 420
+// #define SYS_aio_suspend_nocancel 421
+// #define SYS___sigwait_nocancel 422
+// #define SYS___semwait_signal_nocancel 423
+// #define SYS___mac_mount 424
+// #define SYS___mac_get_mount 425
+// #define SYS___mac_getfsstat 426
+// #define SYS_fsgetpath 427
+// #define SYS_audit_session_self 428
+// #define SYS_audit_session_join 429
+// #define SYS_fileport_makeport 430
+// #define SYS_fileport_makefd 431
+// #define SYS_audit_session_port 432
+// #define SYS_pid_suspend 433
+// #define SYS_pid_resume 434
+// #define SYS_pid_hibernate 435
+// #define SYS_pid_shutdown_sockets 436
+///* 437 old shared_region_slide_np */
+///* 438 old shared_region_map_and_slide_np */
+// #define SYS_kas_info 439
+// #define SYS_memorystatus_control 440
+// #define SYS_guarded_open_np 441
+// #define SYS_guarded_close_np 442
+// #define SYS_guarded_kqueue_np 443
+// #define SYS_change_fdguard_np 444
+// #define SYS_usrctl 445
+// #define SYS_proc_rlimit_control 446
+// #define SYS_connectx 447
+// #define SYS_disconnectx 448
+// #define SYS_peeloff 449
+// #define SYS_socket_delegate 450
+// #define SYS_telemetry 451
+// #define SYS_proc_uuid_policy 452
+// #define SYS_memorystatus_get_level 453
+// #define SYS_system_override 454
+// #define SYS_vfs_purge 455
+// #define SYS_sfi_ctl 456
+// #define SYS_sfi_pidctl 457
+// #define SYS_coalition 458
+// #define SYS_coalition_info 459
+// #define SYS_necp_match_policy 460
+// #define SYS_getattrlistbulk 461
+// #define SYS_clonefileat 462
+// #define SYS_openat 463
+// #define SYS_openat_nocancel 464
+// #define SYS_renameat 465
+// #define SYS_faccessat 466
+// #define SYS_fchmodat 467
+// #define SYS_fchownat 468
+// #define SYS_fstatat 469
+// #define SYS_fstatat64 470
+// #define SYS_linkat 471
+// #define SYS_unlinkat 472
+// #define SYS_readlinkat 473
+// #define SYS_symlinkat 474
+// #define SYS_mkdirat 475
+// #define SYS_getattrlistat 476
+// #define SYS_proc_trace_log 477
+// #define SYS_bsdthread_ctl 478
+// #define SYS_openbyid_np 479
+// #define SYS_recvmsg_x 480
+// #define SYS_sendmsg_x 481
+// #define SYS_thread_selfusage 482
+// #define SYS_csrctl 483
+// #define SYS_guarded_open_dprotected_np 484
+// #define SYS_guarded_write_np 485
+// #define SYS_guarded_pwrite_np 486
+// #define SYS_guarded_writev_np 487
+// #define SYS_renameatx_np 488
+// #define SYS_mremap_encrypted 489
+// #define SYS_netagent_trigger 490
+// #define SYS_stack_snapshot_with_config 491
+// #define SYS_microstackshot 492
+// #define SYS_grab_pgo_data 493
+// #define SYS_persona 494
+///* 495 */
+// #define SYS_mach_eventlink_signal 496
+// #define SYS_mach_eventlink_wait_until 497
+// #define SYS_mach_eventlink_signal_wait_until 498
+// #define SYS_work_interval_ctl 499
+// #define SYS_getentropy 500
+// #define SYS_necp_open 501
+// #define SYS_necp_client_action 502
+// #define SYS___nexus_open 503
+// #define SYS___nexus_register 504
+// #define SYS___nexus_deregister 505
+// #define SYS___nexus_create 506
+// #define SYS___nexus_destroy 507
+// #define SYS___nexus_get_opt 508
+// #define SYS___nexus_set_opt 509
+// #define SYS___channel_open 510
+// #define SYS___channel_get_info 511
+// #define SYS___channel_sync 512
+// #define SYS___channel_get_opt 513
+// #define SYS___channel_set_opt 514
+// #define SYS_ulock_wait 515
+// #define SYS_ulock_wake 516
+// #define SYS_fclonefileat 517
+// #define SYS_fs_snapshot 518
+// #define SYS_register_uexc_handler 519
+// #define SYS_terminate_with_payload 520
+// #define SYS_abort_with_payload 521
+// #define SYS_necp_session_open 522
+// #define SYS_necp_session_action 523
+// #define SYS_setattrlistat 524
+// #define SYS_net_qos_guideline 525
+// #define SYS_fmount 526
+// #define SYS_ntp_adjtime 527
+// #define SYS_ntp_gettime 528
+// #define SYS_os_fault_with_payload 529
+// #define SYS_kqueue_workloop_ctl 530
+// #define SYS___mach_bridge_remote_time 531
+// #define SYS_coalition_ledger 532
+// #define SYS_log_data 533
+// #define SYS_memorystatus_available_memory 534
+// #define SYS_objc_bp_assist_cfg_np 535
+// #define SYS_shared_region_map_and_slide_2_np 536
+// #define SYS_pivot_root 537
+// #define SYS_task_inspect_for_pid 538
+// #define SYS_task_read_for_pid 539
+// #define SYS_preadv 540
+// #define SYS_pwritev 541
+// #define SYS_preadv_nocancel 542
+// #define SYS_pwritev_nocancel 543
+// #define SYS_ulock_wait2 544
+// #define SYS_proc_info_extended_id 545
+// #define SYS_tracker_action 546
+// #define SYS_debug_syscall_reject 547
+// #define SYS_debug_syscall_reject_config 548
+// #define SYS_graftdmg 549
+// #define SYS_map_with_linking_np 550
+// #define SYS_freadlink 551
+// #define SYS_record_system_event 552
+// #define SYS_mkfifoat 553
+// #define SYS_mknodat 554
+// #define SYS_ungraftdmg 555
+// #define SYS_coalition_policy_set 556
+// #define SYS_coalition_policy_get 557
+// #define SYS_MAXSYSCALL 558
+// #define SYS_invalid 63
/* SYSCALL NUMBERS END */
>From 4a1140ac9e42b1efbc177629484433c908284357 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Fri, 7 Nov 2025 19:31:09 +0530
Subject: [PATCH 07/15] [libc] use <sys/syscall.h> as its cleaner and license
compliant
---
libc/include/sys/syscall.h.def | 4 +
.../__support/OSUtil/darwin/aarch64/syscall.h | 572 ------------------
2 files changed, 4 insertions(+), 572 deletions(-)
diff --git a/libc/include/sys/syscall.h.def b/libc/include/sys/syscall.h.def
index 60e5024e500e3..333ad659184a3 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -11,6 +11,9 @@
//TODO: Handle non-linux syscalls
+#if defined(__APPLE__)
+#include <sys/syscall.h>
+#else
#include <asm/unistd.h>
#ifdef __NR_FAST_atomic_update
@@ -2361,5 +2364,6 @@
#define SYS_writev __NR_writev
#endif
+#endif
#endif // LLVM_LIBC_SYS_SYSCALL_H
diff --git a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
index 2e9f1759df85a..dc98c07a8ba33 100644
--- a/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
+++ b/libc/src/__support/OSUtil/darwin/aarch64/syscall.h
@@ -110,576 +110,4 @@ LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
#undef REGISTER_CONSTRAINT_5
#undef REGISTER_CONSTRAINT_6
-/* Following has been copied from MacOSX15.5 sdk
- * This has been referenced from and generated by the syscalls.master file
- * that can be found
- * https://github.com/apple-oss-distributions/xnu/blob/f6217f891ac0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/syscalls.master
- */
-
-/* SYSCALL NUMBERS START */
-
-#include <sys/syscall.h>
-// #define SYS_syscall 0
-// #define SYS_exit 1
-// #define SYS_fork 2
-// #define SYS_read 3
-// #define SYS_write 4
-// #define SYS_open 5
-// #define SYS_close 6
-// #define SYS_wait4 7
-///* 8 old creat */
-// #define SYS_link 9
-// #define SYS_unlink 10
-///* 11 old execv */
-// #define SYS_chdir 12
-// #define SYS_fchdir 13
-// #define SYS_mknod 14
-// #define SYS_chmod 15
-// #define SYS_chown 16
-///* 17 old break */
-// #define SYS_getfsstat 18
-///* 19 old lseek */
-// #define SYS_getpid 20
-///* 21 old mount */
-///* 22 old umount */
-// #define SYS_setuid 23
-// #define SYS_getuid 24
-// #define SYS_geteuid 25
-// #define SYS_ptrace 26
-// #define SYS_recvmsg 27
-// #define SYS_sendmsg 28
-// #define SYS_recvfrom 29
-// #define SYS_accept 30
-// #define SYS_getpeername 31
-// #define SYS_getsockname 32
-// #define SYS_access 33
-// #define SYS_chflags 34
-// #define SYS_fchflags 35
-// #define SYS_sync 36
-// #define SYS_kill 37
-// #define SYS_crossarch_trap 38
-// #define SYS_getppid 39
-///* 40 old lstat */
-// #define SYS_dup 41
-// #define SYS_pipe 42
-// #define SYS_getegid 43
-///* 44 old profil */
-///* 45 old ktrace */
-// #define SYS_sigaction 46
-// #define SYS_getgid 47
-// #define SYS_sigprocmask 48
-// #define SYS_getlogin 49
-// #define SYS_setlogin 50
-// #define SYS_acct 51
-// #define SYS_sigpending 52
-// #define SYS_sigaltstack 53
-// #define SYS_ioctl 54
-// #define SYS_reboot 55
-// #define SYS_revoke 56
-// #define SYS_symlink 57
-// #define SYS_readlink 58
-// #define SYS_execve 59
-// #define SYS_umask 60
-// #define SYS_chroot 61
-///* 62 old fstat */
-///* 63 used internally and reserved */
-///* 64 old getpagesize */
-// #define SYS_msync 65
-// #define SYS_vfork 66
-// #define SYS_oslog_coproc_reg 67
-// #define SYS_oslog_coproc 68
-///* 69 old sbrk */
-///* 70 old sstk */
-///* 71 old mmap */
-///* 72 old vadvise */
-// #define SYS_munmap 73
-// #define SYS_mprotect 74
-// #define SYS_madvise 75
-///* 76 old vhangup */
-///* 77 old vlimit */
-// #define SYS_mincore 78
-// #define SYS_getgroups 79
-// #define SYS_setgroups 80
-// #define SYS_getpgrp 81
-// #define SYS_setpgid 82
-// #define SYS_setitimer 83
-///* 84 old wait */
-// #define SYS_swapon 85
-// #define SYS_getitimer 86
-///* 87 old gethostname */
-///* 88 old sethostname */
-// #define SYS_getdtablesize 89
-// #define SYS_dup2 90
-///* 91 old getdopt */
-// #define SYS_fcntl 92
-// #define SYS_select 93
-///* 94 old setdopt */
-// #define SYS_fsync 95
-// #define SYS_setpriority 96
-// #define SYS_socket 97
-// #define SYS_connect 98
-///* 99 old accept */
-// #define SYS_getpriority 100
-///* 101 old send */
-///* 102 old recv */
-///* 103 old sigreturn */
-// #define SYS_bind 104
-// #define SYS_setsockopt 105
-// #define SYS_listen 106
-///* 107 old vtimes */
-///* 108 old sigvec */
-///* 109 old sigblock */
-///* 110 old sigsetmask */
-// #define SYS_sigsuspend 111
-///* 112 old sigstack */
-///* 113 old recvmsg */
-///* 114 old sendmsg */
-///* 115 old vtrace */
-// #define SYS_gettimeofday 116
-// #define SYS_getrusage 117
-// #define SYS_getsockopt 118
-///* 119 old resuba */
-// #define SYS_readv 120
-// #define SYS_writev 121
-// #define SYS_settimeofday 122
-// #define SYS_fchown 123
-// #define SYS_fchmod 124
-///* 125 old recvfrom */
-// #define SYS_setreuid 126
-// #define SYS_setregid 127
-// #define SYS_rename 128
-///* 129 old truncate */
-///* 130 old ftruncate */
-// #define SYS_flock 131
-// #define SYS_mkfifo 132
-// #define SYS_sendto 133
-// #define SYS_shutdown 134
-// #define SYS_socketpair 135
-// #define SYS_mkdir 136
-// #define SYS_rmdir 137
-// #define SYS_utimes 138
-// #define SYS_futimes 139
-// #define SYS_adjtime 140
-///* 141 old getpeername */
-// #define SYS_gethostuuid 142
-///* 143 old sethostid */
-///* 144 old getrlimit */
-///* 145 old setrlimit */
-///* 146 old killpg */
-// #define SYS_setsid 147
-///* 148 old setquota */
-///* 149 old qquota */
-///* 150 old getsockname */
-// #define SYS_getpgid 151
-// #define SYS_setprivexec 152
-// #define SYS_pread 153
-// #define SYS_pwrite 154
-// #define SYS_nfssvc 155
-///* 156 old getdirentries */
-// #define SYS_statfs 157
-// #define SYS_fstatfs 158
-// #define SYS_unmount 159
-///* 160 old async_daemon */
-// #define SYS_getfh 161
-///* 162 old getdomainname */
-///* 163 old setdomainname */
-///* 164 */
-// #define SYS_quotactl 165
-///* 166 old exportfs */
-// #define SYS_mount 167
-///* 168 old ustat */
-// #define SYS_csops 169
-// #define SYS_csops_audittoken 170
-///* 171 old wait3 */
-///* 172 old rpause */
-// #define SYS_waitid 173
-///* 174 old getdents */
-///* 175 old gc_control */
-///* 176 old add_profil */
-// #define SYS_kdebug_typefilter 177
-// #define SYS_kdebug_trace_string 178
-// #define SYS_kdebug_trace64 179
-// #define SYS_kdebug_trace 180
-// #define SYS_setgid 181
-// #define SYS_setegid 182
-// #define SYS_seteuid 183
-// #define SYS_sigreturn 184
-// #define SYS_panic_with_data 185
-// #define SYS_thread_selfcounts 186
-// #define SYS_fdatasync 187
-// #define SYS_stat 188
-// #define SYS_fstat 189
-// #define SYS_lstat 190
-// #define SYS_pathconf 191
-// #define SYS_fpathconf 192
-///* 193 old getfsstat */
-// #define SYS_getrlimit 194
-// #define SYS_setrlimit 195
-// #define SYS_getdirentries 196
-// #define SYS_mmap 197
-///* 198 old __syscall */
-// #define SYS_lseek 199
-// #define SYS_truncate 200
-// #define SYS_ftruncate 201
-// #define SYS_sysctl 202
-// #define SYS_mlock 203
-// #define SYS_munlock 204
-// #define SYS_undelete 205
-///* 206 old ATsocket */
-///* 207 old ATgetmsg */
-///* 208 old ATputmsg */
-///* 209 old ATsndreq */
-///* 210 old ATsndrsp */
-///* 211 old ATgetreq */
-///* 212 old ATgetrsp */
-///* 213 Reserved for AppleTalk */
-///* 214 */
-///* 215 */
-// #define SYS_open_dprotected_np 216
-// #define SYS_fsgetpath_ext 217
-// #define SYS_openat_dprotected_np 218
-///* 219 old fstatv */
-// #define SYS_getattrlist 220
-// #define SYS_setattrlist 221
-// #define SYS_getdirentriesattr 222
-// #define SYS_exchangedata 223
-///* 224 old checkuseraccess or fsgetpath */
-// #define SYS_searchfs 225
-// #define SYS_delete 226
-// #define SYS_copyfile 227
-// #define SYS_fgetattrlist 228
-// #define SYS_fsetattrlist 229
-// #define SYS_poll 230
-///* 231 old watchevent */
-///* 232 old waitevent */
-///* 233 old modwatch */
-// #define SYS_getxattr 234
-// #define SYS_fgetxattr 235
-// #define SYS_setxattr 236
-// #define SYS_fsetxattr 237
-// #define SYS_removexattr 238
-// #define SYS_fremovexattr 239
-// #define SYS_listxattr 240
-// #define SYS_flistxattr 241
-// #define SYS_fsctl 242
-// #define SYS_initgroups 243
-// #define SYS_posix_spawn 244
-// #define SYS_ffsctl 245
-///* 246 */
-///* 247 old nfsclnt */
-// #define SYS_fhopen 248
-///* 249 */
-// #define SYS_minherit 250
-// #define SYS_semsys 251
-// #define SYS_msgsys 252
-// #define SYS_shmsys 253
-// #define SYS_semctl 254
-// #define SYS_semget 255
-// #define SYS_semop 256
-///* 257 old semconfig */
-// #define SYS_msgctl 258
-// #define SYS_msgget 259
-// #define SYS_msgsnd 260
-// #define SYS_msgrcv 261
-// #define SYS_shmat 262
-// #define SYS_shmctl 263
-// #define SYS_shmdt 264
-// #define SYS_shmget 265
-// #define SYS_shm_open 266
-// #define SYS_shm_unlink 267
-// #define SYS_sem_open 268
-// #define SYS_sem_close 269
-// #define SYS_sem_unlink 270
-// #define SYS_sem_wait 271
-// #define SYS_sem_trywait 272
-// #define SYS_sem_post 273
-// #define SYS_sysctlbyname 274
-///* 275 old sem_init */
-///* 276 old sem_destroy */
-// #define SYS_open_extended 277
-// #define SYS_umask_extended 278
-// #define SYS_stat_extended 279
-// #define SYS_lstat_extended 280
-// #define SYS_fstat_extended 281
-// #define SYS_chmod_extended 282
-// #define SYS_fchmod_extended 283
-// #define SYS_access_extended 284
-// #define SYS_settid 285
-// #define SYS_gettid 286
-// #define SYS_setsgroups 287
-// #define SYS_getsgroups 288
-// #define SYS_setwgroups 289
-// #define SYS_getwgroups 290
-// #define SYS_mkfifo_extended 291
-// #define SYS_mkdir_extended 292
-// #define SYS_identitysvc 293
-// #define SYS_shared_region_check_np 294
-///* 295 old shared_region_map_np */
-// #define SYS_vm_pressure_monitor 296
-// #define SYS_psynch_rw_longrdlock 297
-// #define SYS_psynch_rw_yieldwrlock 298
-// #define SYS_psynch_rw_downgrade 299
-// #define SYS_psynch_rw_upgrade 300
-// #define SYS_psynch_mutexwait 301
-// #define SYS_psynch_mutexdrop 302
-// #define SYS_psynch_cvbroad 303
-// #define SYS_psynch_cvsignal 304
-// #define SYS_psynch_cvwait 305
-// #define SYS_psynch_rw_rdlock 306
-// #define SYS_psynch_rw_wrlock 307
-// #define SYS_psynch_rw_unlock 308
-// #define SYS_psynch_rw_unlock2 309
-// #define SYS_getsid 310
-// #define SYS_settid_with_pid 311
-// #define SYS_psynch_cvclrprepost 312
-// #define SYS_aio_fsync 313
-// #define SYS_aio_return 314
-// #define SYS_aio_suspend 315
-// #define SYS_aio_cancel 316
-// #define SYS_aio_error 317
-// #define SYS_aio_read 318
-// #define SYS_aio_write 319
-// #define SYS_lio_listio 320
-///* 321 old __pthread_cond_wait */
-// #define SYS_iopolicysys 322
-// #define SYS_process_policy 323
-// #define SYS_mlockall 324
-// #define SYS_munlockall 325
-///* 326 */
-// #define SYS_issetugid 327
-// #define SYS___pthread_kill 328
-// #define SYS___pthread_sigmask 329
-// #define SYS___sigwait 330
-// #define SYS___disable_threadsignal 331
-// #define SYS___pthread_markcancel 332
-// #define SYS___pthread_canceled 333
-// #define SYS___semwait_signal 334
-///* 335 old utrace */
-// #define SYS_proc_info 336
-// #define SYS_sendfile 337
-// #define SYS_stat64 338
-// #define SYS_fstat64 339
-// #define SYS_lstat64 340
-// #define SYS_stat64_extended 341
-// #define SYS_lstat64_extended 342
-// #define SYS_fstat64_extended 343
-// #define SYS_getdirentries64 344
-// #define SYS_statfs64 345
-// #define SYS_fstatfs64 346
-// #define SYS_getfsstat64 347
-// #define SYS___pthread_chdir 348
-// #define SYS___pthread_fchdir 349
-// #define SYS_audit 350
-// #define SYS_auditon 351
-///* 352 */
-// #define SYS_getauid 353
-// #define SYS_setauid 354
-///* 355 old getaudit */
-///* 356 old setaudit */
-// #define SYS_getaudit_addr 357
-// #define SYS_setaudit_addr 358
-// #define SYS_auditctl 359
-// #define SYS_bsdthread_create 360
-// #define SYS_bsdthread_terminate 361
-// #define SYS_kqueue 362
-// #define SYS_kevent 363
-// #define SYS_lchown 364
-///* 365 old stack_snapshot */
-// #define SYS_bsdthread_register 366
-// #define SYS_workq_open 367
-// #define SYS_workq_kernreturn 368
-// #define SYS_kevent64 369
-///* 370 old __semwait_signal */
-///* 371 old __semwait_signal */
-// #define SYS_thread_selfid 372
-// #define SYS_ledger 373
-// #define SYS_kevent_qos 374
-// #define SYS_kevent_id 375
-///* 376 */
-///* 377 */
-///* 378 */
-///* 379 */
-// #define SYS___mac_execve 380
-// #define SYS___mac_syscall 381
-// #define SYS___mac_get_file 382
-// #define SYS___mac_set_file 383
-// #define SYS___mac_get_link 384
-// #define SYS___mac_set_link 385
-// #define SYS___mac_get_proc 386
-// #define SYS___mac_set_proc 387
-// #define SYS___mac_get_fd 388
-// #define SYS___mac_set_fd 389
-// #define SYS___mac_get_pid 390
-///* 391 */
-///* 392 */
-///* 393 */
-// #define SYS_pselect 394
-// #define SYS_pselect_nocancel 395
-// #define SYS_read_nocancel 396
-// #define SYS_write_nocancel 397
-// #define SYS_open_nocancel 398
-// #define SYS_close_nocancel 399
-// #define SYS_wait4_nocancel 400
-// #define SYS_recvmsg_nocancel 401
-// #define SYS_sendmsg_nocancel 402
-// #define SYS_recvfrom_nocancel 403
-// #define SYS_accept_nocancel 404
-// #define SYS_msync_nocancel 405
-// #define SYS_fcntl_nocancel 406
-// #define SYS_select_nocancel 407
-// #define SYS_fsync_nocancel 408
-// #define SYS_connect_nocancel 409
-// #define SYS_sigsuspend_nocancel 410
-// #define SYS_readv_nocancel 411
-// #define SYS_writev_nocancel 412
-// #define SYS_sendto_nocancel 413
-// #define SYS_pread_nocancel 414
-// #define SYS_pwrite_nocancel 415
-// #define SYS_waitid_nocancel 416
-// #define SYS_poll_nocancel 417
-// #define SYS_msgsnd_nocancel 418
-// #define SYS_msgrcv_nocancel 419
-// #define SYS_sem_wait_nocancel 420
-// #define SYS_aio_suspend_nocancel 421
-// #define SYS___sigwait_nocancel 422
-// #define SYS___semwait_signal_nocancel 423
-// #define SYS___mac_mount 424
-// #define SYS___mac_get_mount 425
-// #define SYS___mac_getfsstat 426
-// #define SYS_fsgetpath 427
-// #define SYS_audit_session_self 428
-// #define SYS_audit_session_join 429
-// #define SYS_fileport_makeport 430
-// #define SYS_fileport_makefd 431
-// #define SYS_audit_session_port 432
-// #define SYS_pid_suspend 433
-// #define SYS_pid_resume 434
-// #define SYS_pid_hibernate 435
-// #define SYS_pid_shutdown_sockets 436
-///* 437 old shared_region_slide_np */
-///* 438 old shared_region_map_and_slide_np */
-// #define SYS_kas_info 439
-// #define SYS_memorystatus_control 440
-// #define SYS_guarded_open_np 441
-// #define SYS_guarded_close_np 442
-// #define SYS_guarded_kqueue_np 443
-// #define SYS_change_fdguard_np 444
-// #define SYS_usrctl 445
-// #define SYS_proc_rlimit_control 446
-// #define SYS_connectx 447
-// #define SYS_disconnectx 448
-// #define SYS_peeloff 449
-// #define SYS_socket_delegate 450
-// #define SYS_telemetry 451
-// #define SYS_proc_uuid_policy 452
-// #define SYS_memorystatus_get_level 453
-// #define SYS_system_override 454
-// #define SYS_vfs_purge 455
-// #define SYS_sfi_ctl 456
-// #define SYS_sfi_pidctl 457
-// #define SYS_coalition 458
-// #define SYS_coalition_info 459
-// #define SYS_necp_match_policy 460
-// #define SYS_getattrlistbulk 461
-// #define SYS_clonefileat 462
-// #define SYS_openat 463
-// #define SYS_openat_nocancel 464
-// #define SYS_renameat 465
-// #define SYS_faccessat 466
-// #define SYS_fchmodat 467
-// #define SYS_fchownat 468
-// #define SYS_fstatat 469
-// #define SYS_fstatat64 470
-// #define SYS_linkat 471
-// #define SYS_unlinkat 472
-// #define SYS_readlinkat 473
-// #define SYS_symlinkat 474
-// #define SYS_mkdirat 475
-// #define SYS_getattrlistat 476
-// #define SYS_proc_trace_log 477
-// #define SYS_bsdthread_ctl 478
-// #define SYS_openbyid_np 479
-// #define SYS_recvmsg_x 480
-// #define SYS_sendmsg_x 481
-// #define SYS_thread_selfusage 482
-// #define SYS_csrctl 483
-// #define SYS_guarded_open_dprotected_np 484
-// #define SYS_guarded_write_np 485
-// #define SYS_guarded_pwrite_np 486
-// #define SYS_guarded_writev_np 487
-// #define SYS_renameatx_np 488
-// #define SYS_mremap_encrypted 489
-// #define SYS_netagent_trigger 490
-// #define SYS_stack_snapshot_with_config 491
-// #define SYS_microstackshot 492
-// #define SYS_grab_pgo_data 493
-// #define SYS_persona 494
-///* 495 */
-// #define SYS_mach_eventlink_signal 496
-// #define SYS_mach_eventlink_wait_until 497
-// #define SYS_mach_eventlink_signal_wait_until 498
-// #define SYS_work_interval_ctl 499
-// #define SYS_getentropy 500
-// #define SYS_necp_open 501
-// #define SYS_necp_client_action 502
-// #define SYS___nexus_open 503
-// #define SYS___nexus_register 504
-// #define SYS___nexus_deregister 505
-// #define SYS___nexus_create 506
-// #define SYS___nexus_destroy 507
-// #define SYS___nexus_get_opt 508
-// #define SYS___nexus_set_opt 509
-// #define SYS___channel_open 510
-// #define SYS___channel_get_info 511
-// #define SYS___channel_sync 512
-// #define SYS___channel_get_opt 513
-// #define SYS___channel_set_opt 514
-// #define SYS_ulock_wait 515
-// #define SYS_ulock_wake 516
-// #define SYS_fclonefileat 517
-// #define SYS_fs_snapshot 518
-// #define SYS_register_uexc_handler 519
-// #define SYS_terminate_with_payload 520
-// #define SYS_abort_with_payload 521
-// #define SYS_necp_session_open 522
-// #define SYS_necp_session_action 523
-// #define SYS_setattrlistat 524
-// #define SYS_net_qos_guideline 525
-// #define SYS_fmount 526
-// #define SYS_ntp_adjtime 527
-// #define SYS_ntp_gettime 528
-// #define SYS_os_fault_with_payload 529
-// #define SYS_kqueue_workloop_ctl 530
-// #define SYS___mach_bridge_remote_time 531
-// #define SYS_coalition_ledger 532
-// #define SYS_log_data 533
-// #define SYS_memorystatus_available_memory 534
-// #define SYS_objc_bp_assist_cfg_np 535
-// #define SYS_shared_region_map_and_slide_2_np 536
-// #define SYS_pivot_root 537
-// #define SYS_task_inspect_for_pid 538
-// #define SYS_task_read_for_pid 539
-// #define SYS_preadv 540
-// #define SYS_pwritev 541
-// #define SYS_preadv_nocancel 542
-// #define SYS_pwritev_nocancel 543
-// #define SYS_ulock_wait2 544
-// #define SYS_proc_info_extended_id 545
-// #define SYS_tracker_action 546
-// #define SYS_debug_syscall_reject 547
-// #define SYS_debug_syscall_reject_config 548
-// #define SYS_graftdmg 549
-// #define SYS_map_with_linking_np 550
-// #define SYS_freadlink 551
-// #define SYS_record_system_event 552
-// #define SYS_mkfifoat 553
-// #define SYS_mknodat 554
-// #define SYS_ungraftdmg 555
-// #define SYS_coalition_policy_set 556
-// #define SYS_coalition_policy_get 557
-// #define SYS_MAXSYSCALL 558
-// #define SYS_invalid 63
-
-/* SYSCALL NUMBERS END */
-
#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_DARWIN_ARM_SYSCALL_H
>From 5f99c9f132fdfb1da8b08b2ecdd0968a5eddb9e6 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sat, 8 Nov 2025 14:41:59 +0530
Subject: [PATCH 08/15] [libc] include sdk path
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/cmake/modules/LLVMLibCCompileOptionRules.cmake | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index 2eb0f066e19e0..042350546b1c1 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -170,6 +170,19 @@ function(_get_common_compile_options output_var flags)
list(APPEND compile_options "-idirafter${LIBC_KERNEL_HEADERS}")
endif()
endif()
+ if(LIBC_TARGET_OS_IS_DARWIN)
+ execute_process(
+ COMMAND xcrun --sdk macosx --show-sdk-path
+ OUTPUT_VARIABLE MACOSX_SDK_PATH
+ RESULT_VARIABLE MACOSX_SDK_PATH_RESULT
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ if(MACOSX_SDK_PATH_RESULT EQUAL 0)
+ list(APPEND compile_options "-I" "${MACOSX_SDK_PATH}/usr/include")
+ else()
+ message(WARNING "Could not find macOS SDK path. `xcrun --sdk macosx --show-sdk-path` failed.")
+ endif()
+ endif()
endif()
if(LIBC_COMPILER_HAS_FIXED_POINT)
>From e718db1bcf2fa8cd83881da8871be060342ff5a5 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sat, 8 Nov 2025 14:45:03 +0530
Subject: [PATCH 09/15] [libc] make include guards explicit
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/include/sys/syscall.h.def | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libc/include/sys/syscall.h.def b/libc/include/sys/syscall.h.def
index 333ad659184a3..112fdd2d80369 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -9,11 +9,12 @@
#ifndef LLVM_LIBC_SYS_SYSCALL_H
#define LLVM_LIBC_SYS_SYSCALL_H
-//TODO: Handle non-linux syscalls
-
#if defined(__APPLE__)
+
#include <sys/syscall.h>
-#else
+
+#elif defined(__linux__)
+
#include <asm/unistd.h>
#ifdef __NR_FAST_atomic_update
@@ -2364,6 +2365,6 @@
#define SYS_writev __NR_writev
#endif
-#endif
+#endif // __linux__
#endif // LLVM_LIBC_SYS_SYSCALL_H
>From 53b21d26a8ff21bec20596205350dfee5f35fb5d Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Tue, 4 Nov 2025 17:08:20 +0530
Subject: [PATCH 10/15] [libc][test] split exit tests into two separate tests
_Exit(3) is a fairly simple syscall wrapper whereas exit(3) calls
atexit-registered functions + whole lot of stuff that require support for sync
primitives.
Splitting the tests allows testing the former easily (especially for new port
projects)
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/test/src/stdlib/CMakeLists.txt | 13 +++++++++++++
libc/test/src/stdlib/_Exit_test.cpp | 4 ----
libc/test/src/stdlib/exit_test.cpp | 19 +++++++++++++++++++
3 files changed, 32 insertions(+), 4 deletions(-)
create mode 100644 libc/test/src/stdlib/exit_test.cpp
diff --git a/libc/test/src/stdlib/CMakeLists.txt b/libc/test/src/stdlib/CMakeLists.txt
index 0eb373c3fa061..9765e42095aa5 100644
--- a/libc/test/src/stdlib/CMakeLists.txt
+++ b/libc/test/src/stdlib/CMakeLists.txt
@@ -397,6 +397,19 @@ if(LLVM_LIBC_FULL_BUILD)
libc-stdlib-tests
SRCS
_Exit_test.cpp
+ DEPENDS
+ libc.src.__support.OSUtil.osutil
+ libc.src.stdlib._Exit
+ )
+
+ add_libc_test(
+ exit_test
+ # The EXPECT_EXITS test is only availible for unit tests.
+ UNIT_TEST_ONLY
+ SUITE
+ libc-stdlib-tests
+ SRCS
+ exit_test.cpp
DEPENDS
libc.src.stdlib._Exit
libc.src.stdlib.exit
diff --git a/libc/test/src/stdlib/_Exit_test.cpp b/libc/test/src/stdlib/_Exit_test.cpp
index 333277dc01dca..57c432828c2f3 100644
--- a/libc/test/src/stdlib/_Exit_test.cpp
+++ b/libc/test/src/stdlib/_Exit_test.cpp
@@ -7,13 +7,9 @@
//===----------------------------------------------------------------------===//
#include "src/stdlib/_Exit.h"
-#include "src/stdlib/exit.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcStdlib, _Exit) {
EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(1); }, 1);
EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(65); }, 65);
-
- EXPECT_EXITS([] { LIBC_NAMESPACE::exit(1); }, 1);
- EXPECT_EXITS([] { LIBC_NAMESPACE::exit(65); }, 65);
}
diff --git a/libc/test/src/stdlib/exit_test.cpp b/libc/test/src/stdlib/exit_test.cpp
new file mode 100644
index 0000000000000..333277dc01dca
--- /dev/null
+++ b/libc/test/src/stdlib/exit_test.cpp
@@ -0,0 +1,19 @@
+//===-- Unittests for _Exit -----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/_Exit.h"
+#include "src/stdlib/exit.h"
+#include "test/UnitTest/Test.h"
+
+TEST(LlvmLibcStdlib, _Exit) {
+ EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(1); }, 1);
+ EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(65); }, 65);
+
+ EXPECT_EXITS([] { LIBC_NAMESPACE::exit(1); }, 1);
+ EXPECT_EXITS([] { LIBC_NAMESPACE::exit(65); }, 65);
+}
>From 7fe0c004322207e8728fbde70203c8a105de6a09 Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Thu, 6 Nov 2025 14:08:41 +0530
Subject: [PATCH 11/15] [libc] remove _Exit mentions from exit_test.cpp
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/test/src/stdlib/exit_test.cpp | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/libc/test/src/stdlib/exit_test.cpp b/libc/test/src/stdlib/exit_test.cpp
index 333277dc01dca..5c82d8303036a 100644
--- a/libc/test/src/stdlib/exit_test.cpp
+++ b/libc/test/src/stdlib/exit_test.cpp
@@ -1,4 +1,4 @@
-//===-- Unittests for _Exit -----------------------------------------------===//
+//===-- Unittests for exit -----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,14 +6,10 @@
//
//===----------------------------------------------------------------------===//
-#include "src/stdlib/_Exit.h"
#include "src/stdlib/exit.h"
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcStdlib, _Exit) {
- EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(1); }, 1);
- EXPECT_EXITS([] { LIBC_NAMESPACE::_Exit(65); }, 65);
-
+TEST(LlvmLibcStdlib, exit) {
EXPECT_EXITS([] { LIBC_NAMESPACE::exit(1); }, 1);
EXPECT_EXITS([] { LIBC_NAMESPACE::exit(65); }, 65);
}
>From f3cf53abc4bd030cdc69d389a8003948625aa9ae Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Tue, 4 Nov 2025 17:13:50 +0530
Subject: [PATCH 12/15] [libc][darwin] add internal::exit
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/config/darwin/aarch64/entrypoints.txt | 1 +
.../__support/OSUtil/darwin/CMakeLists.txt | 7 ++++--
.../OSUtil/darwin/aarch64/CMakeLists.txt | 2 +-
libc/src/__support/OSUtil/darwin/exit.cpp | 24 +++++++++++++++++++
4 files changed, 31 insertions(+), 3 deletions(-)
create mode 100644 libc/src/__support/OSUtil/darwin/exit.cpp
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index e3c6c2b30c415..3909417f9730d 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -111,6 +111,7 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.setjmp.setjmp
libc.src.setjmp.siglongjmp
libc.src.setjmp.sigsetjmp
+ libc.src.stdlib._Exit
)
endif()
diff --git a/libc/src/__support/OSUtil/darwin/CMakeLists.txt b/libc/src/__support/OSUtil/darwin/CMakeLists.txt
index 4241bb37684f7..9e69bf7d0cbab 100644
--- a/libc/src/__support/OSUtil/darwin/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/darwin/CMakeLists.txt
@@ -4,13 +4,16 @@ endif()
add_subdirectory(${LIBC_TARGET_ARCHITECTURE})
-add_header_library(
+add_object_library(
darwin_util
+ SRCS
+ exit.cpp
HDRS
io.h
syscall.h
DEPENDS
- .${LIBC_TARGET_ARCHITECTURE}.darwin_util
+ .${LIBC_TARGET_ARCHITECTURE}.darwin_${LIBC_TARGET_ARCHITECTURE}_util
libc.src.__support.common
libc.src.__support.CPP.string_view
+ libc.include.sys_syscall
)
diff --git a/libc/src/__support/OSUtil/darwin/aarch64/CMakeLists.txt b/libc/src/__support/OSUtil/darwin/aarch64/CMakeLists.txt
index 5ab95b01758c8..b36fe22017f34 100644
--- a/libc/src/__support/OSUtil/darwin/aarch64/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/darwin/aarch64/CMakeLists.txt
@@ -1,5 +1,5 @@
add_header_library(
- darwin_util
+ darwin_aarch64_util
HDRS
syscall.h
DEPENDS
diff --git a/libc/src/__support/OSUtil/darwin/exit.cpp b/libc/src/__support/OSUtil/darwin/exit.cpp
new file mode 100644
index 0000000000000..032000bd7b0cc
--- /dev/null
+++ b/libc/src/__support/OSUtil/darwin/exit.cpp
@@ -0,0 +1,24 @@
+//===------------ MacOS implementation of an exit function ------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/OSUtil/darwin/syscall.h" // syscall_impl
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "sys/syscall.h" // For syscall numbers.
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+
+__attribute__((noreturn)) void exit(int status) {
+ for (;;) {
+ LIBC_NAMESPACE::syscall_impl<long>(SYS_exit, status);
+ }
+}
+
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
>From f97aaca95cdcc35725a88a8c9e0c5ef59f3ce61c Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Thu, 6 Nov 2025 14:03:23 +0530
Subject: [PATCH 13/15] [libc] use cpp11 attribute syntax
Signed-off-by: Shreeyash Pandey <shreeyash335 at gmail.com>
---
libc/src/__support/OSUtil/darwin/exit.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/src/__support/OSUtil/darwin/exit.cpp b/libc/src/__support/OSUtil/darwin/exit.cpp
index 032000bd7b0cc..7439db2ef38b0 100644
--- a/libc/src/__support/OSUtil/darwin/exit.cpp
+++ b/libc/src/__support/OSUtil/darwin/exit.cpp
@@ -14,7 +14,7 @@
namespace LIBC_NAMESPACE_DECL {
namespace internal {
-__attribute__((noreturn)) void exit(int status) {
+[[noreturn]] void exit(int status) {
for (;;) {
LIBC_NAMESPACE::syscall_impl<long>(SYS_exit, status);
}
>From d281b97afd9960c60f28680a85ff7e7f5c8ed16d Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sat, 8 Nov 2025 23:04:03 +0530
Subject: [PATCH 14/15] [libc] Add clock_gettime for Darwin
This patch adds support for clock_gettime for Darwin. Darwin syscall
'gettimeofday' is used to query the time from the system.
Many headers in llvm-libc-types, namely clockid_t, struct_timespec,
struct_timeval, suseconds_t, time_t_32, time_t_64, are modified to include
header guards as Darwin has its own implementation of primitive types.
---
.../llvm-libc-macros/darwin/CMakeLists.txt | 5 +++
.../llvm-libc-macros/darwin/time-macros.h | 14 ++++++
libc/include/llvm-libc-macros/time-macros.h | 2 +
libc/include/llvm-libc-types/clockid_t.h | 6 +++
.../include/llvm-libc-types/struct_timespec.h | 6 +++
libc/include/llvm-libc-types/struct_timeval.h | 6 +++
libc/include/llvm-libc-types/suseconds_t.h | 6 +++
libc/include/llvm-libc-types/time_t_32.h | 6 +++
libc/include/llvm-libc-types/time_t_64.h | 6 +++
libc/src/__support/time/darwin/CMakeLists.txt | 12 +++++
.../__support/time/darwin/clock_gettime.cpp | 44 +++++++++++++++++++
libc/src/time/darwin/CMakeLists.txt | 10 +++++
libc/src/time/darwin/clock_gettime.cpp | 29 ++++++++++++
.../src/__support/time/darwin/CMakeLists.txt | 8 ++++
.../__support/time/darwin/clock_gettime.cpp | 20 +++++++++
15 files changed, 180 insertions(+)
create mode 100644 libc/include/llvm-libc-macros/darwin/CMakeLists.txt
create mode 100644 libc/include/llvm-libc-macros/darwin/time-macros.h
create mode 100644 libc/src/__support/time/darwin/CMakeLists.txt
create mode 100644 libc/src/__support/time/darwin/clock_gettime.cpp
create mode 100644 libc/src/time/darwin/CMakeLists.txt
create mode 100644 libc/src/time/darwin/clock_gettime.cpp
create mode 100644 libc/test/src/__support/time/darwin/CMakeLists.txt
create mode 100644 libc/test/src/__support/time/darwin/clock_gettime.cpp
diff --git a/libc/include/llvm-libc-macros/darwin/CMakeLists.txt b/libc/include/llvm-libc-macros/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..ea08c63c00301
--- /dev/null
+++ b/libc/include/llvm-libc-macros/darwin/CMakeLists.txt
@@ -0,0 +1,5 @@
+add_header(
+ time_macros
+ HDR
+ time-macros.h
+)
diff --git a/libc/include/llvm-libc-macros/darwin/time-macros.h b/libc/include/llvm-libc-macros/darwin/time-macros.h
new file mode 100644
index 0000000000000..477dfa8eda85f
--- /dev/null
+++ b/libc/include/llvm-libc-macros/darwin/time-macros.h
@@ -0,0 +1,14 @@
+//===-- Definition of macros from time.h ---------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H
+#define LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H
+
+#include <_time.h>
+
+#endif // LLVM_LIBC_MACROS_LINUX_TIME_MACROS_H
diff --git a/libc/include/llvm-libc-macros/time-macros.h b/libc/include/llvm-libc-macros/time-macros.h
index 30e0a310a5485..c026df29b1e7f 100644
--- a/libc/include/llvm-libc-macros/time-macros.h
+++ b/libc/include/llvm-libc-macros/time-macros.h
@@ -7,6 +7,8 @@
#include "linux/time-macros.h"
#elif defined(__ELF__)
#include "baremetal/time-macros.h"
+#elif defined(__APPLE__)
+#include "darwin/time-macros.h"
#else
#define CLOCKS_PER_SEC 1000000
#endif
diff --git a/libc/include/llvm-libc-types/clockid_t.h b/libc/include/llvm-libc-types/clockid_t.h
index 4b059599502c4..926948717c664 100644
--- a/libc/include/llvm-libc-types/clockid_t.h
+++ b/libc/include/llvm-libc-types/clockid_t.h
@@ -9,6 +9,12 @@
#ifndef LLVM_LIBC_TYPES_CLOCKID_T_H
#define LLVM_LIBC_TYPES_CLOCKID_T_H
+#if defined(__APPLE__)
+// Darwin provides its own defintion for clockid_t . Use that to prevent
+// redeclaration errors and correctness.
+#include <_time.h>
+#else
typedef int clockid_t;
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_CLOCKID_T_H
diff --git a/libc/include/llvm-libc-types/struct_timespec.h b/libc/include/llvm-libc-types/struct_timespec.h
index 28b5a571f6790..8993ecc7db8f0 100644
--- a/libc/include/llvm-libc-types/struct_timespec.h
+++ b/libc/include/llvm-libc-types/struct_timespec.h
@@ -9,6 +9,11 @@
#ifndef LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H
#define LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H
+#if defined(__APPLE__)
+// Darwin provides its own definition for struct timespec. Include it directly
+// to ensure type compatibility and avoid redefinition errors.
+#include <sys/_types/_timespec.h>
+#else
#include "time_t.h"
struct timespec {
@@ -16,5 +21,6 @@ struct timespec {
/* TODO: BIG_ENDIAN may require padding. */
long tv_nsec; /* Nanoseconds. */
};
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_STRUCT_TIMESPEC_H
diff --git a/libc/include/llvm-libc-types/struct_timeval.h b/libc/include/llvm-libc-types/struct_timeval.h
index 9595d85a46c8f..41f0b4e92932e 100644
--- a/libc/include/llvm-libc-types/struct_timeval.h
+++ b/libc/include/llvm-libc-types/struct_timeval.h
@@ -12,9 +12,15 @@
#include "suseconds_t.h"
#include "time_t.h"
+#if defined(__APPLE__)
+// Darwin provides its own definition for struct timeval. Include it directly
+// to ensure type compatibility and avoid redefinition errors.
+#include <sys/_types/_timeval.h>
+#else
struct timeval {
time_t tv_sec; // Seconds
suseconds_t tv_usec; // Micro seconds
};
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_STRUCT_TIMEVAL_H
diff --git a/libc/include/llvm-libc-types/suseconds_t.h b/libc/include/llvm-libc-types/suseconds_t.h
index 8e926e8401f5c..acc1822cb59e1 100644
--- a/libc/include/llvm-libc-types/suseconds_t.h
+++ b/libc/include/llvm-libc-types/suseconds_t.h
@@ -14,6 +14,12 @@
// types...] and suseconds_t are no greater than the width of type long.
// The kernel expects 64 bit suseconds_t at least on x86_64.
+#if defined(__APPLE__)
+// Darwin provides its own definition for suseconds_t. Include it directly
+// to ensure type compatibility and avoid redefinition errors.
+#include <sys/_types/_suseconds_t.h>
+#else
typedef long suseconds_t;
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_SUSECONDS_T_H
diff --git a/libc/include/llvm-libc-types/time_t_32.h b/libc/include/llvm-libc-types/time_t_32.h
index 2c415f6fa9dca..8d7a81e5ce7f7 100644
--- a/libc/include/llvm-libc-types/time_t_32.h
+++ b/libc/include/llvm-libc-types/time_t_32.h
@@ -9,6 +9,12 @@
#ifndef LLVM_LIBC_TYPES_TIME_T_32_H
#define LLVM_LIBC_TYPES_TIME_T_32_H
+#if defined(__APPLE__)
+// Darwin provides its own definition for time_t. Include it directly
+// to ensure type compatibility and avoid redefinition errors.
+#include <sys/_types/_time_t.h>
+#else
typedef __INT32_TYPE__ time_t;
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_TIME_T_32_H
diff --git a/libc/include/llvm-libc-types/time_t_64.h b/libc/include/llvm-libc-types/time_t_64.h
index 8f7fd3233646e..c8267abe31289 100644
--- a/libc/include/llvm-libc-types/time_t_64.h
+++ b/libc/include/llvm-libc-types/time_t_64.h
@@ -9,6 +9,12 @@
#ifndef LLVM_LIBC_TYPES_TIME_T_64_H
#define LLVM_LIBC_TYPES_TIME_T_64_H
+#if defined(__APPLE__)
+// Darwin provides its own definition for time_t. Include it directly
+// to ensure type compatibility and avoid redefinition errors.
+#include <sys/_types/_time_t.h>
+#else
typedef __INT64_TYPE__ time_t;
+#endif // __APPLE__
#endif // LLVM_LIBC_TYPES_TIME_T_64_H
diff --git a/libc/src/__support/time/darwin/CMakeLists.txt b/libc/src/__support/time/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..a06a41289a41c
--- /dev/null
+++ b/libc/src/__support/time/darwin/CMakeLists.txt
@@ -0,0 +1,12 @@
+add_object_library(
+ clock_gettime
+ SRCS
+ clock_gettime.cpp
+ HDRS
+ ../clock_gettime.h
+ DEPENDS
+ libc.src.__support.common
+ libc.src.__support.error_or
+ libc.hdr.types.struct_timeval
+ libc.hdr.types.struct_timespec
+)
diff --git a/libc/src/__support/time/darwin/clock_gettime.cpp b/libc/src/__support/time/darwin/clock_gettime.cpp
new file mode 100644
index 0000000000000..158737a6251a0
--- /dev/null
+++ b/libc/src/__support/time/darwin/clock_gettime.cpp
@@ -0,0 +1,44 @@
+//===-- Darwin implementation of internal clock_gettime -------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/time/clock_gettime.h"
+#include "hdr/errno_macros.h" // For EINVAL
+#include "hdr/time_macros.h"
+#include "hdr/types/struct_timespec.h"
+#include "hdr/types/struct_timeval.h"
+#include "src/__support/OSUtil/syscall.h" // For syscall_impl
+#include "src/__support/common.h"
+#include "src/__support/error_or.h"
+#include <sys/syscall.h> // For SYS_gettimeofday
+#include <sys/time.h> // For struct timezone
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+
+ErrorOr<int> clock_gettime(clockid_t clockid, struct timespec *ts) {
+ if (clockid != CLOCK_REALTIME) {
+ return Error(EINVAL);
+ }
+ struct timeval tv;
+ // The second argument to gettimeofday is a timezone pointer
+ // The third argument is mach_absolute_time
+ // Both of these, we don't need here, so they are 0
+ long ret = LIBC_NAMESPACE::syscall_impl<long>(
+ SYS_gettimeofday, reinterpret_cast<long>(&tv), 0, 0);
+ if (ret != 0) {
+ // The syscall returns -1 on error and sets errno.
+ return Error(EINVAL);
+ }
+
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+ return 0;
+}
+
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/time/darwin/CMakeLists.txt b/libc/src/time/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..6d68086c72584
--- /dev/null
+++ b/libc/src/time/darwin/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_entrypoint_object(
+ clock_gettime
+ SRCS
+ clock_gettime.cpp
+ HDRS
+ # The public header is part of the parent directory's library.
+ DEPENDS
+ libc.src.__support.time.clock_gettime
+ libc.src.errno.errno
+)
diff --git a/libc/src/time/darwin/clock_gettime.cpp b/libc/src/time/darwin/clock_gettime.cpp
new file mode 100644
index 0000000000000..f717d05451aca
--- /dev/null
+++ b/libc/src/time/darwin/clock_gettime.cpp
@@ -0,0 +1,29 @@
+//===---------- Darwin implementation of the POSIX clock_gettime function
+//--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/time/clock_gettime.h"
+
+#include "src/__support/common.h"
+#include "src/__support/libc_errno.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/time/clock_gettime.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, clock_gettime,
+ (clockid_t clockid, struct timespec *ts)) {
+ auto result = internal::clock_gettime(clockid, ts);
+ if (!result.has_value()) {
+ libc_errno = result.error();
+ return -1;
+ }
+ return 0;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/src/__support/time/darwin/CMakeLists.txt b/libc/test/src/__support/time/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..ee1247b354173
--- /dev/null
+++ b/libc/test/src/__support/time/darwin/CMakeLists.txt
@@ -0,0 +1,8 @@
+add_libc_test(
+ clock_gettime
+ SUITE libc-support-time-tests
+ SRCS clock_gettime.cpp
+ DEPENDS
+ libc.src.__support.CPP.expected
+ libc.src.__support.time.darwin.clock_gettime
+)
diff --git a/libc/test/src/__support/time/darwin/clock_gettime.cpp b/libc/test/src/__support/time/darwin/clock_gettime.cpp
new file mode 100644
index 0000000000000..d593c5d02744a
--- /dev/null
+++ b/libc/test/src/__support/time/darwin/clock_gettime.cpp
@@ -0,0 +1,20 @@
+//===-- unit tests for darwin's time utilities --------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/time/clock_gettime.h"
+#include "src/__support/CPP/expected.h"
+#include "test/UnitTest/Test.h"
+
+template <class T, class E>
+using expected = LIBC_NAMESPACE::cpp::expected<T, E>;
+
+TEST(LlvmLibcSupportDarwinClockGetTime, BasicGetTime) {
+ struct timespec ts;
+ auto result = LIBC_NAMESPACE::internal::clock_gettime(CLOCK_REALTIME, &ts);
+ ASSERT_TRUE(result.has_value());
+}
>From 06ec1fd1344a3fafd8ec09898e259de72ed6fabc Mon Sep 17 00:00:00 2001
From: Shreeyash Pandey <shreeyash335 at gmail.com>
Date: Sat, 8 Nov 2025 23:22:33 +0530
Subject: [PATCH 15/15] [libc][darwin] add basic mutex support for darwin
This patch adds a basic implementation/wrapper for mutex using the underlying
os_unfair_lock API that macos provides.
---
.../__support/threads/darwin/CMakeLists.txt | 11 ++
libc/src/__support/threads/darwin/mutex.h | 132 ++++++++++++++++++
libc/src/__support/threads/mutex.h | 4 +-
.../__support/threads/darwin/CMakeLists.txt | 9 ++
.../__support/threads/darwin/mutex_test.cpp | 78 +++++++++++
5 files changed, 233 insertions(+), 1 deletion(-)
create mode 100644 libc/src/__support/threads/darwin/CMakeLists.txt
create mode 100644 libc/src/__support/threads/darwin/mutex.h
create mode 100644 libc/test/src/__support/threads/darwin/CMakeLists.txt
create mode 100644 libc/test/src/__support/threads/darwin/mutex_test.cpp
diff --git a/libc/src/__support/threads/darwin/CMakeLists.txt b/libc/src/__support/threads/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..2a7ce0676f68f
--- /dev/null
+++ b/libc/src/__support/threads/darwin/CMakeLists.txt
@@ -0,0 +1,11 @@
+if(NOT TARGET libc.src.__support.OSUtil.osutil)
+ return()
+endif()
+
+add_header_library(
+ mutex
+ HDRS
+ mutex.h
+ DEPENDS
+ libc.src.__support.threads.mutex_common
+)
diff --git a/libc/src/__support/threads/darwin/mutex.h b/libc/src/__support/threads/darwin/mutex.h
new file mode 100644
index 0000000000000..f48803ebe1e7d
--- /dev/null
+++ b/libc/src/__support/threads/darwin/mutex.h
@@ -0,0 +1,132 @@
+//===--- Implementation of a Darwin mutex class ------------------*- C++
+//-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_THREADS_DARWIN_MUTEX_H
+#define LLVM_LIBC_SRC___SUPPORT_THREADS_DARWIN_MUTEX_H
+
+#include "src/__support/libc_assert.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/threads/mutex_common.h"
+#include "src/__support/threads/sleep.h" // For sleep_briefly
+#include "src/__support/time/linux/abs_timeout.h"
+
+#include <mach/mach_init.h> // For mach_thread_self
+#include <mach/mach_port.h> // For mach_port_t and MACH_PORT_NULL
+#include <os/lock.h> // For os_unfair_lock
+#include <time.h> // For clock_gettime
+
+namespace LIBC_NAMESPACE_DECL {
+
+// This file is an implementation of `LIBC_NAMESPACE::mutex` for Darwin-based
+// platforms. It is a wrapper around `os_unfair_lock`, which is a low-level,
+// high-performance locking primitive provided by the kernel.
+//
+// `os_unfair_lock` is a non-recursive, thread-owned lock that blocks waiters
+// efficiently in the kernel. As the name implies, it is "unfair," meaning
+// it does not guarantee the order in which waiting threads acquire the lock.
+// This trade-off allows for higher performance in contended scenarios.
+//
+// The lock must be unlocked from the same thread that locked it. Attempting
+// to unlock from a different thread will result in a runtime error.
+//
+// This implementation is suitable for simple critical sections where fairness
+// and reentrancy are not concerns.
+
+class Mutex final {
+ os_unfair_lock_s lock_val = OS_UNFAIR_LOCK_INIT;
+ mach_port_t owner = MACH_PORT_NULL;
+
+ // API compatibility fields.
+ unsigned char timed;
+ unsigned char recursive;
+ unsigned char robust;
+ unsigned char pshared;
+
+public:
+ LIBC_INLINE constexpr Mutex(bool is_timed, bool is_recursive, bool is_robust,
+ bool is_pshared)
+ : owner(MACH_PORT_NULL), timed(is_timed), recursive(is_recursive),
+ robust(is_robust), pshared(is_pshared) {}
+
+ LIBC_INLINE constexpr Mutex()
+ : owner(MACH_PORT_NULL), timed(0), recursive(0), robust(0), pshared(0) {}
+
+ LIBC_INLINE static MutexError init(Mutex *mutex, bool is_timed, bool is_recur,
+ bool is_robust, bool is_pshared) {
+ mutex->lock_val = OS_UNFAIR_LOCK_INIT;
+ mutex->owner = MACH_PORT_NULL;
+ mutex->timed = is_timed;
+ mutex->recursive = is_recur;
+ mutex->robust = is_robust;
+ mutex->pshared = is_pshared;
+ return MutexError::NONE;
+ }
+
+ LIBC_INLINE static MutexError destroy(Mutex *lock) {
+ LIBC_ASSERT(lock->owner == MACH_PORT_NULL &&
+ "Mutex destroyed while locked.");
+ return MutexError::NONE;
+ }
+
+ LIBC_INLINE MutexError lock() {
+ os_unfair_lock_lock(&lock_val);
+ owner = mach_thread_self();
+ return MutexError::NONE;
+ }
+
+ LIBC_INLINE MutexError timed_lock(internal::AbsTimeout abs_time) {
+ while (true) {
+ if (try_lock() == MutexError::NONE) {
+ return MutexError::NONE;
+ }
+
+ // Manually check if the timeout has expired.
+ struct timespec now;
+ // The clock used here must match the clock used to create the
+ // absolute timeout.
+ clock_gettime(abs_time.is_realtime() ? CLOCK_REALTIME : CLOCK_MONOTONIC,
+ &now);
+ const timespec &target_ts = abs_time.get_timespec();
+
+ if (now.tv_sec > target_ts.tv_sec || (now.tv_sec == target_ts.tv_sec &&
+ now.tv_nsec >= target_ts.tv_nsec)) {
+ // We might have acquired the lock between the last try_lock() and now.
+ // To avoid returning TIMEOUT incorrectly, we do one last try_lock().
+ if (try_lock() == MutexError::NONE)
+ return MutexError::NONE;
+ return MutexError::TIMEOUT;
+ }
+
+ sleep_briefly();
+ }
+ }
+
+ LIBC_INLINE MutexError unlock() {
+ // This check is crucial. It prevents both double-unlocks and unlocks
+ // by threads that do not own the mutex.
+ if (owner != mach_thread_self()) {
+ return MutexError::UNLOCK_WITHOUT_LOCK;
+ }
+ owner = MACH_PORT_NULL;
+ os_unfair_lock_unlock(&lock_val);
+ return MutexError::NONE;
+ }
+
+ LIBC_INLINE MutexError try_lock() {
+ if (os_unfair_lock_trylock(&lock_val)) {
+ owner = mach_thread_self();
+ return MutexError::NONE;
+ }
+ return MutexError::BUSY;
+ }
+};
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_THREADS_DARWIN_MUTEX_H
diff --git a/libc/src/__support/threads/mutex.h b/libc/src/__support/threads/mutex.h
index f64f7e7b40082..e2401507d86ac 100644
--- a/libc/src/__support/threads/mutex.h
+++ b/libc/src/__support/threads/mutex.h
@@ -42,7 +42,9 @@
#if defined(__linux__)
#include "src/__support/threads/linux/mutex.h"
-#endif // __linux__
+#elif defined(__APPLE__)
+#include "src/__support/threads/darwin/mutex.h"
+#endif
#elif LIBC_THREAD_MODE == LIBC_THREAD_MODE_SINGLE
diff --git a/libc/test/src/__support/threads/darwin/CMakeLists.txt b/libc/test/src/__support/threads/darwin/CMakeLists.txt
new file mode 100644
index 0000000000000..50b8259a9fde9
--- /dev/null
+++ b/libc/test/src/__support/threads/darwin/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_libc_test(
+ mutex_test
+ SUITE
+ libc-support-threads-tests
+ SRCS
+ mutex_test.cpp
+ DEPENDS
+ libc.src.__support.threads.darwin.mutex
+)
diff --git a/libc/test/src/__support/threads/darwin/mutex_test.cpp b/libc/test/src/__support/threads/darwin/mutex_test.cpp
new file mode 100644
index 0000000000000..e8b46fdb7ebe3
--- /dev/null
+++ b/libc/test/src/__support/threads/darwin/mutex_test.cpp
@@ -0,0 +1,78 @@
+//===-- Unittests for Darwin's Mutex ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/threads/darwin/mutex.h"
+#include "src/__support/threads/mutex_common.h"
+#include "test/UnitTest/Test.h"
+
+TEST(LlvmLibcSupportThreadsMutexTest, SmokeTest) {
+ LIBC_NAMESPACE::Mutex mutex;
+ ASSERT_EQ(mutex.lock(), LIBC_NAMESPACE::MutexError::NONE);
+ ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::NONE);
+ ASSERT_EQ(mutex.try_lock(), LIBC_NAMESPACE::MutexError::NONE);
+ ASSERT_EQ(mutex.try_lock(), LIBC_NAMESPACE::MutexError::BUSY);
+ ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::NONE);
+ ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::UNLOCK_WITHOUT_LOCK);
+}
+
+// TEST(LlvmLibcSupportThreadsRawMutexTest, Timeout) {
+// LIBC_NAMESPACE::RawMutex mutex;
+// ASSERT_TRUE(mutex.lock());
+// timespec ts;
+// LIBC_NAMESPACE::internal::clock_gettime(CLOCK_MONOTONIC, &ts);
+// ts.tv_sec += 1;
+// // Timeout will be respected when deadlock happens.
+// auto timeout = LIBC_NAMESPACE::internal::AbsTimeout::from_timespec(ts,
+// false); ASSERT_TRUE(timeout.has_value());
+// // The following will timeout
+// ASSERT_FALSE(mutex.lock(*timeout));
+// ASSERT_TRUE(mutex.unlock());
+// // Test that the mutex works after the timeout.
+// ASSERT_TRUE(mutex.lock());
+// ASSERT_TRUE(mutex.unlock());
+// // If a lock can be acquired directly, expired timeout will not count.
+// // Notice that the timeout is already reached during preivous deadlock.
+// ASSERT_TRUE(mutex.lock(*timeout));
+// ASSERT_TRUE(mutex.unlock());
+// }
+//
+// TEST(LlvmLibcSupportThreadsRawMutexTest, PSharedLock) {
+// struct SharedData {
+// LIBC_NAMESPACE::RawMutex mutex;
+// LIBC_NAMESPACE::cpp::Atomic<size_t> finished;
+// int data;
+// };
+// void *addr =
+// LIBC_NAMESPACE::mmap(nullptr, sizeof(SharedData), PROT_READ |
+// PROT_WRITE,
+// MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+// ASSERT_NE(addr, MAP_FAILED);
+// auto *shared = reinterpret_cast<SharedData *>(addr);
+// shared->data = 0;
+// LIBC_NAMESPACE::RawMutex::init(&shared->mutex);
+// // Avoid pull in our own implementation of pthread_t.
+// #ifdef SYS_fork
+// long pid = LIBC_NAMESPACE::syscall_impl<long>(SYS_fork);
+// #elif defined(SYS_clone)
+// long pid = LIBC_NAMESPACE::syscall_impl<long>(SYS_clone, SIGCHLD, 0);
+// #endif
+// for (int i = 0; i < 10000; ++i) {
+// shared->mutex.lock(LIBC_NAMESPACE::cpp::nullopt, true);
+// shared->data++;
+// shared->mutex.unlock(true);
+// }
+// // Mark the thread as finished.
+// shared->finished.fetch_add(1);
+// // let the child exit early to avoid output pollution
+// if (pid == 0)
+// LIBC_NAMESPACE::exit(0);
+// while (shared->finished.load() != 2)
+// LIBC_NAMESPACE::sleep_briefly();
+// ASSERT_EQ(shared->data, 20000);
+// LIBC_NAMESPACE::munmap(addr, sizeof(SharedData));
+// }
More information about the libc-commits
mailing list