Skip to content

Commit 455fdb6

Browse files
committed
🧱 extract mem.c/h shims for memcpy/memset
Use explicit byte-loop implementations instead of __builtin_mem* to avoid infinite recursion when clang lowers builtins back to libc calls on some versions.
1 parent 9fd96bd commit 455fdb6

6 files changed

Lines changed: 35 additions & 10 deletions

File tree

.clang-format

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
BasedOnStyle: LLVM
2+
SortIncludes: Never

src/buffer.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
/* buffer.c — fixed-capacity byte buffer */
22

33
#include "buffer.h"
4+
#include "mem.h"
45
#include "utf8.h"
56

6-
typedef __SIZE_TYPE__ size_t;
7-
8-
void *memcpy(void *dst, const void *src, size_t n) {
9-
return __builtin_memcpy(dst, src, n);
10-
}
11-
12-
void *memset(void *dst, int c, size_t n) { return __builtin_memset(dst, c, n); }
13-
147
static size_t strlen(const char *s) {
158
size_t n = 0;
169
while (s[n])

src/clayterm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "../clay/clay.h"
1414
#include "buffer.h"
1515
#include "cell.h"
16+
#include "mem.h"
1617
#include "utf8.h"
1718
#include "wcwidth.h"
1819

@@ -290,7 +291,7 @@ static uint32_t rd(uint32_t *buf, int len, int *i) {
290291
static float rdf(uint32_t *buf, int len, int *i) {
291292
uint32_t v = rd(buf, len, i);
292293
float f;
293-
__builtin_memcpy(&f, &v, 4);
294+
memcpy(&f, &v, 4);
294295
return f;
295296
}
296297

src/mem.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/* mem.c — memcpy/memset shims for freestanding wasm32 */
2+
3+
#include "mem.h"
4+
5+
void *memcpy(void *dst, const void *src, size_t n) {
6+
unsigned char *d = (unsigned char *)dst;
7+
const unsigned char *s = (const unsigned char *)src;
8+
while (n--)
9+
*d++ = *s++;
10+
return dst;
11+
}
12+
13+
void *memset(void *dst, int c, size_t n) {
14+
unsigned char *d = (unsigned char *)dst;
15+
while (n--)
16+
*d++ = (unsigned char)c;
17+
return dst;
18+
}

src/mem.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* mem.h — memcpy/memset shims for freestanding wasm32 */
2+
3+
#ifndef MEM_H
4+
#define MEM_H
5+
6+
typedef __SIZE_TYPE__ size_t;
7+
8+
void *memcpy(void *dst, const void *src, size_t n);
9+
void *memset(void *dst, int c, size_t n);
10+
11+
#endif

src/module.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
#include "../clay/clay.h"
44

5+
#include "mem.c"
56
#include "buffer.c"
67
#include "cell.c"
7-
#include "clayterm.c"
88
#include "utf8.c"
99
#include "wcwidth.c"
10+
#include "clayterm.c"

0 commit comments

Comments
 (0)