From 12af6573696030021485c3e7e3a379414b064993 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 10 Sep 2021 15:59:14 +0100 Subject: [PATCH] Unify `memset` usage across platforms and `core:c/libc` --- core/c/libc/string.odin | 5 ++- core/mem/mem.odin | 9 +---- core/runtime/procs_essence.odin | 23 ----------- core/runtime/procs_unix.odin | 17 -------- core/runtime/procs_wasm32.odin | 15 ------- core/runtime/procs_windows_386.odin | 53 ------------------------- core/runtime/procs_windows_amd64.odin | 56 --------------------------- 7 files changed, 4 insertions(+), 174 deletions(-) delete mode 100644 core/runtime/procs_essence.odin delete mode 100644 core/runtime/procs_unix.odin delete mode 100644 core/runtime/procs_wasm32.odin diff --git a/core/c/libc/string.odin b/core/c/libc/string.odin index c46a90d89..822fe43c5 100644 --- a/core/c/libc/string.odin +++ b/core/c/libc/string.odin @@ -1,6 +1,7 @@ - package libc +import "core:runtime" + // 7.24 String handling when ODIN_OS == "windows" { @@ -37,7 +38,7 @@ foreign libc { strtok :: proc(s1: [^]char, s2: cstring) -> [^]char --- // 7.24.6 Miscellaneous functions - memset :: proc(s: rawptr, c: int, n: size_t) -> rawptr --- + memset : proc(s: rawptr, c: int, n: size_t) -> rawptr : runtime.memset strerror :: proc(errnum: int) -> [^]char --- strlen :: proc(s: cstring) -> size_t --- } diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 562c04c9e..6b216e029 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -4,14 +4,7 @@ import "core:runtime" import "core:intrinsics" set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr #no_bounds_check { - if data != nil && len != 0 { - b := byte(value) - p := ([^]byte)(data)[:len] - for v in &p { - v = b - } - } - return data + return runtime.memset(data, i32(value), len) } zero :: proc "contextless" (data: rawptr, len: int) -> rawptr { return set(data, 0, len) diff --git a/core/runtime/procs_essence.odin b/core/runtime/procs_essence.odin deleted file mode 100644 index f5759ed90..000000000 --- a/core/runtime/procs_essence.odin +++ /dev/null @@ -1,23 +0,0 @@ -//+private -package runtime - -@(link_name="memset") -memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { - addr := 0x1000 + 196 * size_of(int); - fp := (rawptr(((^uintptr)(uintptr(addr)))^)); - return ((proc "c" (rawptr, i32, int) -> rawptr)(fp))(ptr, val, len); -} - -@(link_name="memmove") -memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr { - addr := 0x1000 + 195 * size_of(int); - fp := (rawptr(((^uintptr)(uintptr(addr)))^)); - return ((proc "c" (rawptr, rawptr, int) -> rawptr)(fp))(dst, src, len); -} - -@(link_name="memcpy") -memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr { - addr := 0x1000 + 194 * size_of(int); - fp := (rawptr(((^uintptr)(uintptr(addr)))^)); - return ((proc "c" (rawptr, rawptr, int) -> rawptr)(fp))(dst, src, len); -} diff --git a/core/runtime/procs_unix.odin b/core/runtime/procs_unix.odin deleted file mode 100644 index 442c8c3eb..000000000 --- a/core/runtime/procs_unix.odin +++ /dev/null @@ -1,17 +0,0 @@ -//+build linux, darwin, freebsd -//+private -package runtime - -import "core:intrinsics" - -@(link_name="memset") -memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check { - if ptr != nil && len != 0 { - b := byte(val) - p := ([^]byte)(ptr)[:len] - for v in &p { - v = b - } - } - return ptr -} diff --git a/core/runtime/procs_wasm32.odin b/core/runtime/procs_wasm32.odin deleted file mode 100644 index 5ef701173..000000000 --- a/core/runtime/procs_wasm32.odin +++ /dev/null @@ -1,15 +0,0 @@ -//+build wasm32 -//+private -package runtime - -@(link_name="memset") -memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check { - if ptr != nil && len != 0 { - b := byte(val) - p := ([^]byte)(ptr)[:len] - for v in &p { - v = b - } - } - return ptr -} diff --git a/core/runtime/procs_windows_386.odin b/core/runtime/procs_windows_386.odin index 8b71367c3..37441ab64 100644 --- a/core/runtime/procs_windows_386.odin +++ b/core/runtime/procs_windows_386.odin @@ -26,56 +26,3 @@ windows_trap_type_assertion :: proc "contextless" () -> ! { @(private, require, link_name="_tls_index") _tls_index: u32 @(private, require, link_name="_tls_array") _tls_array: u32 - - - -@(link_name="memcpy") -memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr { - if dst == nil || src == nil || len == 0 || dst == src { - return dst - } - d := ([^]byte)(dst) - s := ([^]byte)(src) - - for i in 0.. rawptr { - if dst == nil || src == nil || len == 0 || dst == src { - return dst - } - - d := ([^]byte)(dst) - s := ([^]byte)(src) - - if s < d && d < s[len:] { - // Overlap - for i := len-1; len >= 0; i -= 1 { - d[i] = s[i] - } - - } else { - for i in 0.. rawptr { - if ptr != nil && len != 0 { - b := byte(val) - p := ([^]byte)(ptr)[:len] - for v in &p { - v = b - } - } - return ptr -} diff --git a/core/runtime/procs_windows_amd64.odin b/core/runtime/procs_windows_amd64.odin index 1e0a0e396..e5f24e53b 100644 --- a/core/runtime/procs_windows_amd64.odin +++ b/core/runtime/procs_windows_amd64.odin @@ -26,59 +26,3 @@ windows_trap_type_assertion :: proc "contextless" () -> ! { // @private // @(link_name="_fltused") // _fltused: i32 = 0x9875; - -// @(link_name="memcpy") -memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr { - foreign kernel32 { - RtlCopyMemory :: proc "c" (dst, src: rawptr, len: int) --- - } - if dst == nil || src == nil || len == 0 { - return dst - } - RtlCopyMemory(dst, src, len) - return dst -} - -// @(link_name="memmove") -memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr { - foreign kernel32 { - RtlMoveMemory :: proc "c" (dst, src: rawptr, len: int) --- - } - if dst == nil || src == nil || len == 0 { - return dst - } - RtlMoveMemory(dst, src, len) - return dst -} - -// @(link_name="memset") -memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check { - if ptr != nil && len != 0 { - b := byte(val) - p := ([^]byte)(ptr)[:len] - for v in &p { - v = b - } - } - return ptr -} - -// @(link_name="memcmp") -// memcmp :: proc "c" (dst, src: rawptr, len: int) -> i32 { -// if dst == nil || src == nil { -// return 0; -// } -// if dst == src { -// return 0; -// } -// d, s := uintptr(dst), uintptr(src); -// n := uintptr(len); - -// for i := uintptr(0); i < n; i += 1 { -// x, y := (^byte)(d+i)^, (^byte)(s+i)^; -// if x != y { -// return x < y ? -1 : +1; -// } -// } -// return 0; -// }