Skip to content

Conversation

@bojle
Copy link
Contributor

@bojle bojle commented Nov 4, 2025

_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)

@llvmbot llvmbot added the libc label Nov 4, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 4, 2025

@llvm/pr-subscribers-libc

Author: Shreeyash Pandey (bojle)

Changes

_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)


Full diff: https://github.com/llvm/llvm-project/pull/166355.diff

6 Files Affected:

  • (modified) libc/src/__support/OSUtil/darwin/aarch64/syscall.h (+561)
  • (modified) libc/test/UnitTest/CMakeLists.txt (+1-1)
  • (modified) libc/test/UnitTest/ExecuteFunctionUnix.cpp (+1-3)
  • (modified) libc/test/src/stdlib/CMakeLists.txt (+13)
  • (modified) libc/test/src/stdlib/_Exit_test.cpp (-4)
  • (added) libc/test/src/stdlib/exit_test.cpp (+19)
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
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()
 
diff --git a/libc/test/UnitTest/ExecuteFunctionUnix.cpp b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
index c0e85c2144005..7c2eb7c6e887c 100644
--- a/libc/test/UnitTest/ExecuteFunctionUnix.cpp
+++ b/libc/test/UnitTest/ExecuteFunctionUnix.cpp
@@ -57,9 +57,7 @@ ProcessStatus invoke_in_subprocess(FunctionCaller *func, int timeout_ms) {
   }
   ::close(pipe_fds[1]);
 
-  struct pollfd poll_fd {
-    pipe_fds[0], 0, 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) {
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);
+}

@bojle
Copy link
Contributor Author

bojle commented Nov 4, 2025

This is a part of a stack of PRs. My tool is partially broken as I don't have write access to this repo. For convenience, please look at the diff of the latest commit in this PR to ignore rest of the stack: ed6ca5f

@bojle bojle force-pushed the exit_split branch 2 times, most recently from 0d97d2e to 7fe0c00 Compare November 8, 2025 09:17
@bojle
Copy link
Contributor Author

bojle commented Nov 8, 2025

Would like your review on this too @lntue @michaelrj-google @SchrodingerZhu

struct pollfd poll_fd {
pipe_fds[0], 0, 0
};
struct pollfd poll_fd{pipe_fds[0], POLLIN, 0};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: also remove struct if it's not needed.

@SchrodingerZhu
Copy link
Contributor

SchrodingerZhu commented Nov 12, 2025

@bojle can you address lntue's comment? I think struct is not needed here as long as there is no function named pollfd.

@bojle
Copy link
Contributor Author

bojle commented Nov 13, 2025

@SchrodingerZhu done

@SchrodingerZhu SchrodingerZhu enabled auto-merge (squash) November 13, 2025 20:09
auto-merge was automatically disabled November 14, 2025 11:45

Head branch was pushed to by a user without write access

bojle added 13 commits November 14, 2025 17:37
Signed-off-by: Shreeyash Pandey <[email protected]>
Signed-off-by: Shreeyash Pandey <[email protected]>
_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 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants