Skip to content

Commit 8f4d9a4

Browse files
committed
wasm2c: Mmap+guard on big-endian won't move memory (fix #2599)
1 parent d58b169 commit 8f4d9a4

File tree

14 files changed

+112
-80
lines changed

14 files changed

+112
-80
lines changed

src/prebuilt/wasm2c_simd_source_declarations.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ R"w2c_template(#elif defined(__GNUC__) && defined(__aarch64__)
66
)w2c_template"
77
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
88
)w2c_template"
9+
R"w2c_template(#elif defined(__GNUC__) && defined(__s390x__)
10+
)w2c_template"
11+
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"f"(var));
12+
)w2c_template"
913
R"w2c_template(#else
1014
)w2c_template"
1115
R"w2c_template(#define SIMD_FORCE_READ(var)

src/prebuilt/wasm2c_source_declarations.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ R"w2c_template(// A pointer for an object of size n.
3131
)w2c_template"
3232
R"w2c_template(#if WABT_BIG_ENDIAN
3333
)w2c_template"
34-
R"w2c_template(#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
34+
R"w2c_template(#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
3535
)w2c_template"
3636
R"w2c_template(#else
3737
)w2c_template"
38-
R"w2c_template(#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
38+
R"w2c_template(#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
3939
)w2c_template"
4040
R"w2c_template(#endif
4141
)w2c_template"
@@ -194,7 +194,7 @@ R"w2c_template( if (UNLIKELY(add_overflow(offset, len, &res))) \
194194
)w2c_template"
195195
R"w2c_template( TRAP(OOB); \
196196
)w2c_template"
197-
R"w2c_template( if (UNLIKELY(res > mem->size)) \
197+
R"w2c_template( if (UNLIKELY(res > (mem)->size)) \
198198
)w2c_template"
199199
R"w2c_template( TRAP(OOB); \
200200
)w2c_template"

src/template/wasm2c.declarations.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
// Result:
1616
// A pointer for an object of size n.
1717
#if WABT_BIG_ENDIAN
18-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
18+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
1919
#else
20-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
20+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
2121
#endif
2222

2323
// We can only use Segue for this module if it uses a single unshared imported
@@ -104,7 +104,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
104104
uint64_t res; \
105105
if (UNLIKELY(add_overflow(offset, len, &res))) \
106106
TRAP(OOB); \
107-
if (UNLIKELY(res > mem->size)) \
107+
if (UNLIKELY(res > (mem)->size)) \
108108
TRAP(OOB); \
109109
} while (0);
110110

src/template/wasm2c_simd.declarations.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
33
#elif defined(__GNUC__) && defined(__aarch64__)
44
#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
5+
#elif defined(__GNUC__) && defined(__s390x__)
6+
#define SIMD_FORCE_READ(var) __asm__("" ::"f"(var));
57
#else
68
#define SIMD_FORCE_READ(var)
79
#endif

test/wasm2c/add.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ u32 w2c_test_add(w2c_test*, u32, u32);
8282
// Result:
8383
// A pointer for an object of size n.
8484
#if WABT_BIG_ENDIAN
85-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
85+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
8686
#else
87-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
87+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
8888
#endif
8989

9090
// We can only use Segue for this module if it uses a single unshared imported
@@ -171,7 +171,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
171171
uint64_t res; \
172172
if (UNLIKELY(add_overflow(offset, len, &res))) \
173173
TRAP(OOB); \
174-
if (UNLIKELY(res > mem->size)) \
174+
if (UNLIKELY(res > (mem)->size)) \
175175
TRAP(OOB); \
176176
} while (0);
177177

test/wasm2c/check-imports.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ extern const u32 wasm2c_test_pagesize_env_0x5F_linear_memory;
107107
// Result:
108108
// A pointer for an object of size n.
109109
#if WABT_BIG_ENDIAN
110-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
110+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
111111
#else
112-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
112+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
113113
#endif
114114

115115
// We can only use Segue for this module if it uses a single unshared imported
@@ -196,7 +196,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
196196
uint64_t res; \
197197
if (UNLIKELY(add_overflow(offset, len, &res))) \
198198
TRAP(OOB); \
199-
if (UNLIKELY(res > mem->size)) \
199+
if (UNLIKELY(res > (mem)->size)) \
200200
TRAP(OOB); \
201201
} while (0);
202202

test/wasm2c/export-names.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ void w2c_test_0xE20x9D0xA40xEF0xB80x8F(w2c_test*);
107107
// Result:
108108
// A pointer for an object of size n.
109109
#if WABT_BIG_ENDIAN
110-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
110+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
111111
#else
112-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
112+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
113113
#endif
114114

115115
// We can only use Segue for this module if it uses a single unshared imported
@@ -196,7 +196,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
196196
uint64_t res; \
197197
if (UNLIKELY(add_overflow(offset, len, &res))) \
198198
TRAP(OOB); \
199-
if (UNLIKELY(res > mem->size)) \
199+
if (UNLIKELY(res > (mem)->size)) \
200200
TRAP(OOB); \
201201
} while (0);
202202

test/wasm2c/hello.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ void w2c_test_0x5Fstart(w2c_test*);
114114
// Result:
115115
// A pointer for an object of size n.
116116
#if WABT_BIG_ENDIAN
117-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
117+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
118118
#else
119-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
119+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
120120
#endif
121121

122122
// We can only use Segue for this module if it uses a single unshared imported
@@ -203,7 +203,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
203203
uint64_t res; \
204204
if (UNLIKELY(add_overflow(offset, len, &res))) \
205205
TRAP(OOB); \
206-
if (UNLIKELY(res > mem->size)) \
206+
if (UNLIKELY(res > (mem)->size)) \
207207
TRAP(OOB); \
208208
} while (0);
209209

test/wasm2c/minimal.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ wasm_rt_func_type_t wasm2c_test_get_func_type(uint32_t param_count, uint32_t res
7676
// Result:
7777
// A pointer for an object of size n.
7878
#if WABT_BIG_ENDIAN
79-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
79+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
8080
#else
81-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
81+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
8282
#endif
8383

8484
// We can only use Segue for this module if it uses a single unshared imported
@@ -165,7 +165,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
165165
uint64_t res; \
166166
if (UNLIKELY(add_overflow(offset, len, &res))) \
167167
TRAP(OOB); \
168-
if (UNLIKELY(res > mem->size)) \
168+
if (UNLIKELY(res > (mem)->size)) \
169169
TRAP(OOB); \
170170
} while (0);
171171

test/wasm2c/tail-calls.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ void wasm_tailcall_w2c_test_tailcaller(void **instance_ptr, void *tail_call_stac
106106
// Result:
107107
// A pointer for an object of size n.
108108
#if WABT_BIG_ENDIAN
109-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
109+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
110110
#else
111-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
111+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
112112
#endif
113113

114114
// We can only use Segue for this module if it uses a single unshared imported
@@ -195,7 +195,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
195195
uint64_t res; \
196196
if (UNLIKELY(add_overflow(offset, len, &res))) \
197197
TRAP(OOB); \
198-
if (UNLIKELY(res > mem->size)) \
198+
if (UNLIKELY(res > (mem)->size)) \
199199
TRAP(OOB); \
200200
} while (0);
201201

wasm2c/benchmarks/dhrystone/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ typedef uint32_t u32;
1818
typedef uint64_t u64;
1919

2020
#if WABT_BIG_ENDIAN
21-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
21+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
2222
#else
23-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
23+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
2424
#endif
2525

2626
#define MEM_ADDR_MEMOP(mem, addr, n) MEM_ADDR(mem, addr, n)

wasm2c/examples/fac/fac.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
// Result:
3535
// A pointer for an object of size n.
3636
#if WABT_BIG_ENDIAN
37-
#define MEM_ADDR(mem, addr, n) &(mem)->data[(mem)->size - (addr) - (n)]
37+
#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
3838
#else
39-
#define MEM_ADDR(mem, addr, n) &(mem)->data[addr]
39+
#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
4040
#endif
4141

4242
// We can only use Segue for this module if it uses a single unshared imported
@@ -123,7 +123,7 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
123123
uint64_t res; \
124124
if (UNLIKELY(add_overflow(offset, len, &res))) \
125125
TRAP(OOB); \
126-
if (UNLIKELY(res > mem->size)) \
126+
if (UNLIKELY(res > (mem)->size)) \
127127
TRAP(OOB); \
128128
} while (0);
129129

@@ -171,18 +171,16 @@ static inline bool add_overflow(uint64_t a, uint64_t b, uint64_t* resptr) {
171171
#define FORCE_READ_FLOAT(var)
172172
#endif
173173

174-
static inline void load_data(void* dest, const void* src, size_t n) {
174+
static inline void load_data(u8* dest, const u8* src, size_t n) {
175175
if (!n) {
176176
return;
177177
}
178-
wasm_rt_memcpy(dest, src, n);
179178
#if WABT_BIG_ENDIAN
180-
u8* dest_chars = dest;
181-
for (size_t i = 0; i < (n >> 1); i++) {
182-
u8 cursor = dest_chars[i];
183-
dest_chars[i] = dest_chars[n - i - 1];
184-
dest_chars[n - i - 1] = cursor;
179+
for (size_t i = 0; i < n; i++) {
180+
dest[i] = src[n - i - 1];
185181
}
182+
#else
183+
wasm_rt_memcpy(dest, src, n);
186184
#endif
187185
}
188186

@@ -621,8 +619,10 @@ static inline void memory_init(wasm_rt_memory_t* dest,
621619
LOAD_DATA((*dest), dest_addr, src + src_addr, n);
622620
}
623621

622+
typedef enum { RefFunc, RefNull, GlobalGet } wasm_elem_segment_expr_type_t;
623+
624624
typedef struct {
625-
enum { RefFunc, RefNull, GlobalGet } expr_type;
625+
wasm_elem_segment_expr_type_t expr_type;
626626
wasm_rt_func_type_t type;
627627
wasm_rt_function_ptr_t func;
628628
wasm_rt_tailcallee_t func_tailcallee;
@@ -771,7 +771,7 @@ wasm_rt_func_type_t wasm2c_fac_get_func_type(uint32_t param_count, uint32_t resu
771771

772772
if (param_count == 1 && result_count == 1) {
773773
va_start(args, result_count);
774-
if (true && va_arg(args, wasm_rt_type_t) == WASM_RT_I32 && va_arg(args, wasm_rt_type_t) == WASM_RT_I32) {
774+
if (true && va_arg(args, int) == WASM_RT_I32 && va_arg(args, int) == WASM_RT_I32) {
775775
va_end(args);
776776
return w2c_fac_t0;
777777
}

0 commit comments

Comments
 (0)