From ab85f49f93c777b94648b5c5bf721753950b4308 Mon Sep 17 00:00:00 2001 From: Shreeyash Pandey 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 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 --- 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 #include #include +#include #include #include #include @@ -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 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 #include #include -#include #include #include #include @@ -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 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 --- .../__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 Date: Wed, 5 Nov 2025 12:00:29 +0530 Subject: [PATCH 05/15] [libc] add reference for syscall numbers Signed-off-by: Shreeyash Pandey --- 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 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 +// #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 Date: Fri, 7 Nov 2025 19:31:09 +0530 Subject: [PATCH 07/15] [libc] use 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 +#else #include #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 -// #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 Date: Sat, 8 Nov 2025 14:41:59 +0530 Subject: [PATCH 08/15] [libc] include sdk path Signed-off-by: Shreeyash Pandey --- 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 Date: Sat, 8 Nov 2025 14:45:03 +0530 Subject: [PATCH 09/15] [libc] make include guards explicit Signed-off-by: Shreeyash Pandey --- 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 -#else + +#elif defined(__linux__) + #include #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 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 --- 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 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 --- 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 Date: Tue, 4 Nov 2025 17:13:50 +0530 Subject: [PATCH 12/15] [libc][darwin] add internal::exit Signed-off-by: Shreeyash Pandey --- 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(SYS_exit, status); + } +} + +} // namespace internal +} // namespace LIBC_NAMESPACE_DECL From f97aaca95cdcc35725a88a8c9e0c5ef59f3ce61c Mon Sep 17 00:00:00 2001 From: Shreeyash Pandey Date: Thu, 6 Nov 2025 14:03:23 +0530 Subject: [PATCH 13/15] [libc] use cpp11 attribute syntax Signed-off-by: Shreeyash Pandey --- 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(SYS_exit, status); } From d281b97afd9960c60f28680a85ff7e7f5c8ed16d Mon Sep 17 00:00:00 2001 From: Shreeyash Pandey 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 +#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 +#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 +#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 +#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 +#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 // For SYS_gettimeofday +#include // For struct timezone + +namespace LIBC_NAMESPACE_DECL { +namespace internal { + +ErrorOr 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( + SYS_gettimeofday, reinterpret_cast(&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 +using expected = LIBC_NAMESPACE::cpp::expected; + +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 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 // For mach_thread_self +#include // For mach_port_t and MACH_PORT_NULL +#include // For os_unfair_lock +#include // 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 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(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(SYS_fork); +// #elif defined(SYS_clone) +// long pid = LIBC_NAMESPACE::syscall_impl(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)); +// }