From 455fdb6390369f487cf0beb3f034dbb28ccd949d Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Mon, 16 Mar 2026 18:57:27 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B1=20extract=20mem.c/h=20shims=20for?= =?UTF-8?q?=20memcpy/memset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use explicit byte-loop implementations instead of __builtin_mem* to avoid infinite recursion when clang lowers builtins back to libc calls on some versions. --- .clang-format | 1 + src/buffer.c | 9 +-------- src/clayterm.c | 3 ++- src/mem.c | 18 ++++++++++++++++++ src/mem.h | 11 +++++++++++ src/module.c | 3 ++- 6 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 src/mem.c create mode 100644 src/mem.h diff --git a/.clang-format b/.clang-format index 9b3aa8b..5aa5600 100644 --- a/.clang-format +++ b/.clang-format @@ -1 +1,2 @@ BasedOnStyle: LLVM +SortIncludes: Never diff --git a/src/buffer.c b/src/buffer.c index b9c449f..21b2253 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1,16 +1,9 @@ /* buffer.c — fixed-capacity byte buffer */ #include "buffer.h" +#include "mem.h" #include "utf8.h" -typedef __SIZE_TYPE__ size_t; - -void *memcpy(void *dst, const void *src, size_t n) { - return __builtin_memcpy(dst, src, n); -} - -void *memset(void *dst, int c, size_t n) { return __builtin_memset(dst, c, n); } - static size_t strlen(const char *s) { size_t n = 0; while (s[n]) diff --git a/src/clayterm.c b/src/clayterm.c index 1047062..52481a5 100644 --- a/src/clayterm.c +++ b/src/clayterm.c @@ -13,6 +13,7 @@ #include "../clay/clay.h" #include "buffer.h" #include "cell.h" +#include "mem.h" #include "utf8.h" #include "wcwidth.h" @@ -290,7 +291,7 @@ static uint32_t rd(uint32_t *buf, int len, int *i) { static float rdf(uint32_t *buf, int len, int *i) { uint32_t v = rd(buf, len, i); float f; - __builtin_memcpy(&f, &v, 4); + memcpy(&f, &v, 4); return f; } diff --git a/src/mem.c b/src/mem.c new file mode 100644 index 0000000..77818fd --- /dev/null +++ b/src/mem.c @@ -0,0 +1,18 @@ +/* mem.c — memcpy/memset shims for freestanding wasm32 */ + +#include "mem.h" + +void *memcpy(void *dst, const void *src, size_t n) { + unsigned char *d = (unsigned char *)dst; + const unsigned char *s = (const unsigned char *)src; + while (n--) + *d++ = *s++; + return dst; +} + +void *memset(void *dst, int c, size_t n) { + unsigned char *d = (unsigned char *)dst; + while (n--) + *d++ = (unsigned char)c; + return dst; +} diff --git a/src/mem.h b/src/mem.h new file mode 100644 index 0000000..747b921 --- /dev/null +++ b/src/mem.h @@ -0,0 +1,11 @@ +/* mem.h — memcpy/memset shims for freestanding wasm32 */ + +#ifndef MEM_H +#define MEM_H + +typedef __SIZE_TYPE__ size_t; + +void *memcpy(void *dst, const void *src, size_t n); +void *memset(void *dst, int c, size_t n); + +#endif diff --git a/src/module.c b/src/module.c index 398535b..75276c0 100644 --- a/src/module.c +++ b/src/module.c @@ -2,8 +2,9 @@ #include "../clay/clay.h" +#include "mem.c" #include "buffer.c" #include "cell.c" -#include "clayterm.c" #include "utf8.c" #include "wcwidth.c" +#include "clayterm.c" -- 2.51.2