aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
Diffstat (limited to 'base')
-rw-r--r--base/runtime/os_specific.odin4
-rw-r--r--base/runtime/os_specific_bsd.odin11
-rw-r--r--base/runtime/os_specific_darwin.odin10
-rw-r--r--base/runtime/os_specific_freestanding.odin4
-rw-r--r--base/runtime/os_specific_haiku.odin6
-rw-r--r--base/runtime/os_specific_js.odin5
-rw-r--r--base/runtime/os_specific_linux.odin14
-rw-r--r--base/runtime/os_specific_orca.odin5
-rw-r--r--base/runtime/os_specific_wasi.odin8
-rw-r--r--base/runtime/os_specific_windows.odin6
10 files changed, 73 insertions, 0 deletions
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