From 79bf171210cd7e1622caf1d3136ebec148984b1a Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 16 Apr 2025 16:39:36 +0100 Subject: [PATCH] Fix #263. --- sqlite3/libc/libc.wasm | Bin 2081 -> 2075 bytes sqlite3/libc/libc.wat | 451 +++++++++++++++++++++-------------------- sqlite3/sqlite_opt.h | 4 +- sqlite3/strings.c | 61 +++--- sqlite3/vfs.c | 5 +- 5 files changed, 270 insertions(+), 251 deletions(-) diff --git a/sqlite3/libc/libc.wasm b/sqlite3/libc/libc.wasm index 68687cdf41200f41814c03e2e3bf4d548b2a34e2..f3761564dbea085bf113264ce25596df95eab1da 100755 GIT binary patch delta 373 zcmY+9ze)o^5XR@vCKl_FwX&UEYg5~~TPOqx67mRI$X%fa=~7(b1E^f5m8CX{c`NZ1 z7M#5(Xfrb~eBbx`p52qXf5Fd(*T?P-i91>gq)F=yMT&afw1G1i5X_UXlMli;FHMwj zzD%8%RU5EEDPj ztc>~%-ga+D)Zv=qF(kJt3KE!A3RJQ{{V@Z8K$*ehMP6!#$rmRkCYacgQhU@Yt`4x} zQ|Vk&t-zsbNU$tE)n1UW_Uc_0syFptG@S}J_WhUR4+#$>1wpvbIl*-8~rXtk^lez delta 382 zcmYk2J4ysW5QeMz5w*iKENCXxW2~v^bTFG3i0l!}++bY|HyDrLvWaM9sF-;WGf!YB z;sqN0YX%=QbV2jg|LD7TAFm(ybNzVRFPK-R)gvayW7i6oI$7Ha6(SN__R6d>LOGr# zQfA(mTpv{wf|#!2Ae_H=nOIl$vBA>;=MiV%%4SLwgu)dY(~p+WJm0+WW&fdXW@UQ8 z_C>CjNTE{62xDxiM #include #include +#include <__macro_PAGESIZE.h> #ifdef __wasm_bulk_memory__ @@ -42,23 +43,25 @@ int memcmp(const void *v1, const void *v2, size_t n) { } void *memchr(const void *v, int c, size_t n) { - c = (uint8_t)c; - + uintptr_t align = (uintptr_t)v % sizeof(v128_t); + const v128_t *w = (void *)(v - align); const v128_t wc = wasm_i8x16_splat(c); - const v128_t *w = (void *)v; - for (; n >= sizeof(v128_t); n -= sizeof(v128_t)) { - if (wasm_v128_any_true(wasm_i8x16_eq(wasm_v128_load(w), wc))) { - break; + + while (true) { + const v128_t cmp = wasm_i8x16_eq(*w, wc); + if (wasm_v128_any_true(cmp)) { + int mask = wasm_i8x16_bitmask(cmp) >> align << align; + __builtin_assume(mask || align); + if (mask) { + return (void *)w + __builtin_ctz(mask); + } } + if (__builtin_sub_overflow(n, sizeof(v128_t) - align, &n)) { + return NULL; + } + align = 0; w++; } - - const uint8_t *u = (void *)w; - while (n--) { - if (*u == c) return (void *)u; - u++; - } - return 0; } size_t strlen(const char *s) { @@ -80,32 +83,40 @@ size_t strlen(const char *s) { } int strcmp(const char *s1, const char *s2) { + const v128_t *const limit = + (v128_t *)(__builtin_wasm_memory_size(0) * PAGESIZE) - 1; + const v128_t *w1 = (void *)s1; const v128_t *w2 = (void *)s2; - if (((uintptr_t)s1 | (uintptr_t)s2) % sizeof(v128_t) == 0) { - while (!wasm_v128_any_true(*w1 ^ *w2)) { - if (!wasm_i8x16_all_true(*w1)) { - return 0; - } - w1++; - w2++; + while (w1 <= limit && w2 <= limit) { + if (wasm_v128_any_true(wasm_v128_load(w1) ^ wasm_v128_load(w2))) { + break; } + if (!wasm_i8x16_all_true(wasm_v128_load(w1))) { + return 0; + } + w1++; + w2++; } const uint8_t *u1 = (void *)w1; const uint8_t *u2 = (void *)w2; while (true) { if (*u1 != *u2) return *u1 - *u2; - if (*u1 == 0) return 0; + if (*u1 == 0) break; u1++; u2++; } + return 0; } int strncmp(const char *s1, const char *s2, size_t n) { + const v128_t *const limit = + (v128_t *)(__builtin_wasm_memory_size(0) * PAGESIZE) - 1; + const v128_t *w1 = (void *)s1; const v128_t *w2 = (void *)s2; - for (; n >= sizeof(v128_t); n -= sizeof(v128_t)) { + for (; w1 <= limit && w2 <= limit && n >= sizeof(v128_t); n -= sizeof(v128_t)) { if (wasm_v128_any_true(wasm_v128_load(w1) ^ wasm_v128_load(w2))) { break; } @@ -128,9 +139,7 @@ int strncmp(const char *s1, const char *s2, size_t n) { } char *strchrnul(const char *s, int c) { - c = (char)c; - - if (__builtin_constant_p(c) && c == 0) { + if (__builtin_constant_p(c) && (char)c == 0) { return (char *)s + strlen(s); } @@ -154,7 +163,7 @@ char *strchrnul(const char *s, int c) { char *strchr(const char *s, int c) { char *r = strchrnul(s, c); - return *(char *)r == (char)c ? r : 0; + return *(char *)r == (char)c ? r : NULL; } #endif diff --git a/sqlite3/vfs.c b/sqlite3/vfs.c index e69396e..e659f3b 100644 --- a/sqlite3/vfs.c +++ b/sqlite3/vfs.c @@ -137,9 +137,10 @@ sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName) { // Create a new C wrapper. sqlite3_vfs *head = go_vfs_list; - go_vfs_list = malloc(sizeof(sqlite3_vfs) + strlen(zVfsName) + 1); + size_t vfsNameLen = strlen(zVfsName); + go_vfs_list = malloc(sizeof(sqlite3_vfs) + vfsNameLen + 1); char *name = (char *)(go_vfs_list + 1); - strcpy(name, zVfsName); + memcpy(name, zVfsName, vfsNameLen + 1); *go_vfs_list = (sqlite3_vfs){ .iVersion = 2, .szOsFile = sizeof(struct go_file),