xref: /aosp_15_r20/external/musl/src/exit/exit.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
3*c9945492SAndroid Build Coastguard Worker #include "libc.h"
4*c9945492SAndroid Build Coastguard Worker 
dummy()5*c9945492SAndroid Build Coastguard Worker static void dummy()
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker }
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker /* atexit.c and __stdio_exit.c override these. the latter is linked
10*c9945492SAndroid Build Coastguard Worker  * as a consequence of linking either __toread.c or __towrite.c. */
11*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __funcs_on_exit);
12*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __stdio_exit);
13*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, _fini);
14*c9945492SAndroid Build Coastguard Worker 
15*c9945492SAndroid Build Coastguard Worker extern weak hidden void (*const __fini_array_start)(void), (*const __fini_array_end)(void);
16*c9945492SAndroid Build Coastguard Worker 
libc_exit_fini(void)17*c9945492SAndroid Build Coastguard Worker static void libc_exit_fini(void)
18*c9945492SAndroid Build Coastguard Worker {
19*c9945492SAndroid Build Coastguard Worker 	uintptr_t a = (uintptr_t)&__fini_array_end;
20*c9945492SAndroid Build Coastguard Worker 	for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
21*c9945492SAndroid Build Coastguard Worker 		(*(void (**)())(a-sizeof(void(*)())))();
22*c9945492SAndroid Build Coastguard Worker 	_fini();
23*c9945492SAndroid Build Coastguard Worker }
24*c9945492SAndroid Build Coastguard Worker 
25*c9945492SAndroid Build Coastguard Worker weak_alias(libc_exit_fini, __libc_exit_fini);
26*c9945492SAndroid Build Coastguard Worker 
exit(int code)27*c9945492SAndroid Build Coastguard Worker _Noreturn void exit(int code)
28*c9945492SAndroid Build Coastguard Worker {
29*c9945492SAndroid Build Coastguard Worker 	__funcs_on_exit();
30*c9945492SAndroid Build Coastguard Worker 	__libc_exit_fini();
31*c9945492SAndroid Build Coastguard Worker 	__stdio_exit();
32*c9945492SAndroid Build Coastguard Worker 	_Exit(code);
33*c9945492SAndroid Build Coastguard Worker }
34