diff --git a/base/runtime/os_specific.odin b/base/runtime/os_specific.odin index 2807eaf90..b6c1288d0 100644 --- a/base/runtime/os_specific.odin +++ b/base/runtime/os_specific.odin @@ -5,3 +5,7 @@ _OS_Errno :: distinct int stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { return _stderr_write(data) } + +exit :: proc "contextless" (code: int) -> ! { + _exit(code) +} \ No newline at end of file diff --git a/base/runtime/os_specific_bsd.odin b/base/runtime/os_specific_bsd.odin index 466001ada..1c3a04e92 100644 --- a/base/runtime/os_specific_bsd.odin +++ b/base/runtime/os_specific_bsd.odin @@ -24,3 +24,14 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { } return int(ret), 0 } + + +foreign import libc "system:c" + +_exit :: proc "contextless" (code: int) -> ! { + @(default_calling_convention="c") + foreign libc { + exit :: proc(status: i32) -> ! --- + } + exit(i32(code)) +} \ No newline at end of file diff --git a/base/runtime/os_specific_darwin.odin b/base/runtime/os_specific_darwin.odin index 907899d7c..37315240f 100644 --- a/base/runtime/os_specific_darwin.odin +++ b/base/runtime/os_specific_darwin.odin @@ -26,3 +26,13 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { return 0, _OS_Errno(__error()^) } } + +foreign import libc "system:System" + +_exit :: proc "contextless" (code: int) -> ! { + @(default_calling_convention="c") + foreign libc { + exit :: proc(status: i32) -> ! --- + } + exit(i32(code)) +} \ No newline at end of file diff --git a/base/runtime/os_specific_freestanding.odin b/base/runtime/os_specific_freestanding.odin index f975f61b8..b5a5fb146 100644 --- a/base/runtime/os_specific_freestanding.odin +++ b/base/runtime/os_specific_freestanding.odin @@ -6,3 +6,7 @@ package runtime _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { return 0, -1 } + +_exit :: proc "contextless" (code: int) -> ! { + trap() +} \ No newline at end of file diff --git a/base/runtime/os_specific_haiku.odin b/base/runtime/os_specific_haiku.odin index 0d1ec7a03..9c9608aab 100644 --- a/base/runtime/os_specific_haiku.odin +++ b/base/runtime/os_specific_haiku.odin @@ -19,3 +19,9 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { } return int(ret), 0 } + + + +_exit :: proc "contextless" (code: int) -> ! { + +} \ No newline at end of file diff --git a/base/runtime/os_specific_js.odin b/base/runtime/os_specific_js.odin index f1d12c808..bd88b1871 100644 --- a/base/runtime/os_specific_js.odin +++ b/base/runtime/os_specific_js.odin @@ -11,3 +11,8 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { write(1, data) return len(data), 0 } + + +_exit :: proc "contextless" (code: int) -> ! { + trap() +} \ No newline at end of file diff --git a/base/runtime/os_specific_linux.odin b/base/runtime/os_specific_linux.odin index d7b7371a7..e24454bf3 100644 --- a/base/runtime/os_specific_linux.odin +++ b/base/runtime/os_specific_linux.odin @@ -24,3 +24,17 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { } return ret, 0 } + + +_exit :: proc "contextless" (code: int) -> ! { + SYS_exit_group :: + 231 when ODIN_ARCH == .amd64 else + 248 when ODIN_ARCH == .arm32 else + 94 when ODIN_ARCH == .arm64 else + 252 when ODIN_ARCH == .i386 else + 94 when ODIN_ARCH == .riscv64 else + 0 + + intrinsics.syscall(uintptr(SYS_exit_group), i32(code)) + unreachable() +} diff --git a/base/runtime/os_specific_orca.odin b/base/runtime/os_specific_orca.odin index 876d7d44b..491edcfa4 100644 --- a/base/runtime/os_specific_orca.odin +++ b/base/runtime/os_specific_orca.odin @@ -41,3 +41,8 @@ _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { return len(data), 0 } + + +_exit :: proc "contextless" (code: int) -> ! { + trap() +} \ No newline at end of file diff --git a/base/runtime/os_specific_wasi.odin b/base/runtime/os_specific_wasi.odin index aa562050c..194034865 100644 --- a/base/runtime/os_specific_wasi.odin +++ b/base/runtime/os_specific_wasi.odin @@ -23,6 +23,9 @@ foreign wasi { argv: [^]cstring, argv_buf: [^]byte, ) -> u16 --- + + @(private="file") + proc_exit :: proc(rval: u32) -> ! --- } _stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { @@ -53,3 +56,8 @@ _wasi_setup_args :: proc() { delete(args_buf) } } + + +_exit :: proc "contextless" (code: int) -> ! { + proc_exit(u32(code)) +} \ No newline at end of file diff --git a/base/runtime/os_specific_windows.odin b/base/runtime/os_specific_windows.odin index b966193ca..c5ca1e4c5 100644 --- a/base/runtime/os_specific_windows.odin +++ b/base/runtime/os_specific_windows.odin @@ -14,6 +14,8 @@ foreign kernel32 { SetHandleInformation :: proc(hObject: rawptr, dwMask: u32, dwFlags: u32) -> b32 --- WriteFile :: proc(hFile: rawptr, lpBuffer: rawptr, nNumberOfBytesToWrite: u32, lpNumberOfBytesWritten: ^u32, lpOverlapped: rawptr) -> b32 --- GetLastError :: proc() -> u32 --- + + ExitProcess :: proc(code: u32) -> ! --- } _stderr_write :: proc "contextless" (data: []byte) -> (n: int, err: _OS_Errno) #no_bounds_check { @@ -49,3 +51,7 @@ _stderr_write :: proc "contextless" (data: []byte) -> (n: int, err: _OS_Errno) # n = int(total_write) return } + +_exit :: proc "contextless" (code: int) -> ! { + ExitProcess(u32(code)) +} \ No newline at end of file