aboutsummaryrefslogtreecommitdiff
path: root/base/runtime
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-06-06 13:02:16 +0100
committergingerBill <bill@gingerbill.org>2024-06-06 13:02:16 +0100
commitc4ef8e7f6ceb4e2ce5d4869931d8f82afc1eb44c (patch)
treeb7adc511b3c0bc88b17def7a334424baf8829f8c /base/runtime
parent155516b897450ec265cfb53b6e32db90f15544f5 (diff)
parent9b66b0c8e6a934a1dc4ab68cfc02652e7a26c179 (diff)
Merge branch 'master' of https://github.com/odin-lang/Odin
Diffstat (limited to 'base/runtime')
-rw-r--r--base/runtime/core.odin15
-rw-r--r--base/runtime/default_allocators_general.odin2
-rw-r--r--base/runtime/entry_wasm.odin36
-rw-r--r--base/runtime/error_checks.odin4
-rw-r--r--base/runtime/heap_allocator_orca.odin29
-rw-r--r--base/runtime/heap_allocator_other.odin2
-rw-r--r--base/runtime/os_specific_orca.odin43
-rw-r--r--base/runtime/procs.odin2
8 files changed, 117 insertions, 16 deletions
diff --git a/base/runtime/core.odin b/base/runtime/core.odin
index 47b9a690c..3e24060af 100644
--- a/base/runtime/core.odin
+++ b/base/runtime/core.odin
@@ -701,7 +701,7 @@ default_assertion_failure_proc :: proc(prefix, message: string, loc: Source_Code
when ODIN_OS == .Freestanding {
// Do nothing
} else {
- when !ODIN_DISABLE_ASSERT {
+ when ODIN_OS != .Orca && !ODIN_DISABLE_ASSERT {
print_caller_location(loc)
print_string(" ")
}
@@ -710,7 +710,18 @@ default_assertion_failure_proc :: proc(prefix, message: string, loc: Source_Code
print_string(": ")
print_string(message)
}
- print_byte('\n')
+
+ when ODIN_OS == .Orca {
+ assert_fail(
+ cstring(raw_data(loc.file_path)),
+ cstring(raw_data(loc.procedure)),
+ loc.line,
+ "",
+ cstring(raw_data(orca_stderr_buffer[:orca_stderr_buffer_idx])),
+ )
+ } else {
+ print_byte('\n')
+ }
}
trap()
}
diff --git a/base/runtime/default_allocators_general.odin b/base/runtime/default_allocators_general.odin
index ab4dd1db8..64af6c904 100644
--- a/base/runtime/default_allocators_general.odin
+++ b/base/runtime/default_allocators_general.odin
@@ -6,7 +6,7 @@ when ODIN_DEFAULT_TO_NIL_ALLOCATOR {
} else when ODIN_DEFAULT_TO_PANIC_ALLOCATOR {
default_allocator_proc :: panic_allocator_proc
default_allocator :: panic_allocator
-} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
+} else when ODIN_OS != .Orca && (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) {
default_allocator :: default_wasm_allocator
default_allocator_proc :: wasm_allocator_proc
} else {
diff --git a/base/runtime/entry_wasm.odin b/base/runtime/entry_wasm.odin
index c608942ba..a24c6f4b7 100644
--- a/base/runtime/entry_wasm.odin
+++ b/base/runtime/entry_wasm.odin
@@ -6,15 +6,29 @@ package runtime
import "base:intrinsics"
when !ODIN_TEST && !ODIN_NO_ENTRY_POINT {
- @(link_name="_start", linkage="strong", require, export)
- _start :: proc "c" () {
- context = default_context()
- #force_no_inline _startup_runtime()
- intrinsics.__entry_point()
+ when ODIN_OS == .Orca {
+ @(linkage="strong", require, export)
+ oc_on_init :: proc "c" () {
+ context = default_context()
+ #force_no_inline _startup_runtime()
+ intrinsics.__entry_point()
+ }
+ @(linkage="strong", require, export)
+ oc_on_terminate :: proc "c" () {
+ context = default_context()
+ #force_no_inline _cleanup_runtime()
+ }
+ } else {
+ @(link_name="_start", linkage="strong", require, export)
+ _start :: proc "c" () {
+ context = default_context()
+ #force_no_inline _startup_runtime()
+ intrinsics.__entry_point()
+ }
+ @(link_name="_end", linkage="strong", require, export)
+ _end :: proc "c" () {
+ context = default_context()
+ #force_no_inline _cleanup_runtime()
+ }
}
- @(link_name="_end", linkage="strong", require, export)
- _end :: proc "c" () {
- context = default_context()
- #force_no_inline _cleanup_runtime()
- }
-} \ No newline at end of file
+}
diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin
index 742e06a71..32a895c3f 100644
--- a/base/runtime/error_checks.odin
+++ b/base/runtime/error_checks.odin
@@ -4,6 +4,8 @@ package runtime
bounds_trap :: proc "contextless" () -> ! {
when ODIN_OS == .Windows {
windows_trap_array_bounds()
+ } else when ODIN_OS == .Orca {
+ abort_ext("", "", 0, "bounds trap")
} else {
trap()
}
@@ -13,6 +15,8 @@ bounds_trap :: proc "contextless" () -> ! {
type_assertion_trap :: proc "contextless" () -> ! {
when ODIN_OS == .Windows {
windows_trap_type_assertion()
+ } else when ODIN_OS == .Orca {
+ abort_ext("", "", 0, "type assertion trap")
} else {
trap()
}
diff --git a/base/runtime/heap_allocator_orca.odin b/base/runtime/heap_allocator_orca.odin
new file mode 100644
index 000000000..c22a67ca1
--- /dev/null
+++ b/base/runtime/heap_allocator_orca.odin
@@ -0,0 +1,29 @@
+//+build orca
+//+private
+package runtime
+
+foreign {
+ @(link_name="malloc") _orca_malloc :: proc "c" (size: int) -> rawptr ---
+ @(link_name="calloc") _orca_calloc :: proc "c" (num, size: int) -> rawptr ---
+ @(link_name="free") _orca_free :: proc "c" (ptr: rawptr) ---
+ @(link_name="realloc") _orca_realloc :: proc "c" (ptr: rawptr, size: int) -> rawptr ---
+}
+
+_heap_alloc :: proc(size: int, zero_memory := true) -> rawptr {
+ if size <= 0 {
+ return nil
+ }
+ if zero_memory {
+ return _orca_calloc(1, size)
+ } else {
+ return _orca_malloc(size)
+ }
+}
+
+_heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
+ return _orca_realloc(ptr, new_size)
+}
+
+_heap_free :: proc(ptr: rawptr) {
+ _orca_free(ptr)
+}
diff --git a/base/runtime/heap_allocator_other.odin b/base/runtime/heap_allocator_other.odin
index 45049c7e9..74536ada9 100644
--- a/base/runtime/heap_allocator_other.odin
+++ b/base/runtime/heap_allocator_other.odin
@@ -12,4 +12,4 @@ _heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr {
_heap_free :: proc(ptr: rawptr) {
unimplemented("base:runtime 'heap_free' procedure is not supported on this platform")
-} \ No newline at end of file
+}
diff --git a/base/runtime/os_specific_orca.odin b/base/runtime/os_specific_orca.odin
new file mode 100644
index 000000000..b6f5930ab
--- /dev/null
+++ b/base/runtime/os_specific_orca.odin
@@ -0,0 +1,43 @@
+//+build orca
+//+private
+package runtime
+
+import "base:intrinsics"
+
+// Constants allowing to specify the level of logging verbosity.
+log_level :: enum u32 {
+ // Only errors are logged.
+ ERROR = 0,
+ // Only warnings and errors are logged.
+ WARNING = 1,
+ // All messages are logged.
+ INFO = 2,
+ COUNT = 3,
+}
+
+@(default_calling_convention="c", link_prefix="oc_")
+foreign {
+ abort_ext :: proc(file: cstring, function: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) -> ! ---
+ assert_fail :: proc(file: cstring, function: cstring, line: i32, src: cstring, fmt: cstring, #c_vararg args: ..any) -> ! ---
+ log_ext :: proc(level: log_level, function: cstring, file: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) ---
+}
+
+// NOTE: This is all pretty gross, don't look.
+
+// WASM is single threaded so this should be fine.
+orca_stderr_buffer: [4096]byte
+orca_stderr_buffer_idx: int
+
+_stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) {
+ for b in data {
+ orca_stderr_buffer[orca_stderr_buffer_idx] = b
+ orca_stderr_buffer_idx += 1
+
+ if b == '\n' || orca_stderr_buffer_idx == len(orca_stderr_buffer)-1 {
+ log_ext(.ERROR, "", "", 0, cstring(raw_data(orca_stderr_buffer[:orca_stderr_buffer_idx])))
+ orca_stderr_buffer_idx = 0
+ }
+ }
+
+ return len(data), 0
+}
diff --git a/base/runtime/procs.odin b/base/runtime/procs.odin
index c9347463b..002a6501f 100644
--- a/base/runtime/procs.odin
+++ b/base/runtime/procs.odin
@@ -25,7 +25,7 @@ when ODIN_NO_CRT && ODIN_OS == .Windows {
RtlMoveMemory(dst, src, len)
return dst
}
-} else when ODIN_NO_CRT || (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) {
+} else when ODIN_NO_CRT || (ODIN_OS != .Orca && (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32)) {
// NOTE: on wasm, calls to these procs are generated (by LLVM) with type `i32` instead of `int`.
//
// NOTE: `#any_int` is also needed, because calls that we generate (and package code)