Skip to content

Commit b0c6d5c

Browse files
authored
add testcases for shared heap and fix POP_MEM_OFFSET of memory64 (#3916)
- add testcases for shared_heap - fix POP_MEM_OFFSET and POP_TBL_ELEM_IDX of memory64 Signed-off-by: wenlingyun1 <[email protected]>
1 parent dbdf3df commit b0c6d5c

File tree

6 files changed

+197
-22
lines changed

6 files changed

+197
-22
lines changed

core/iwasm/interpreter/wasm_interp_classic.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -593,8 +593,8 @@ wasm_interp_get_frame_ref(WASMInterpFrame *frame)
593593
#endif
594594

595595
#if WASM_ENABLE_MEMORY64 != 0
596-
#define POP_MEM_OFFSET() (is_memory64 ? POP_I64() : POP_I32())
597-
#define POP_TBL_ELEM_IDX() (is_table64 ? POP_I64() : POP_I32())
596+
#define POP_MEM_OFFSET() (is_memory64 ? POP_I64() : (uint32)POP_I32())
597+
#define POP_TBL_ELEM_IDX() (is_table64 ? POP_I64() : (uint32)POP_I32())
598598
#else
599599
#define POP_MEM_OFFSET() POP_I32()
600600
#define POP_TBL_ELEM_IDX() POP_I32()

tests/unit/shared-heap/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ project(test-shared-heap)
88
add_definitions(-DRUN_ON_LINUX)
99

1010
set(WAMR_BUILD_APP_FRAMEWORK 0)
11-
set(WAMR_BUILD_AOT 0)
11+
set(WAMR_BUILD_AOT 1)
1212
set(WAMR_BUILD_INTERP 1)
1313
set(WAMR_BUILD_FAST_INTERP 1)
1414
set(WAMR_BUILD_JIT 0)

tests/unit/shared-heap/shared_heap_test.cc

+115-17
Original file line numberDiff line numberDiff line change
@@ -92,37 +92,28 @@ destroy_module_env(struct ret_env module_env)
9292
}
9393
}
9494

95-
TEST_F(shared_heap_test, test_shared_heap)
95+
static void test_shared_heap(WASMSharedHeap *shared_heap, const char *file, const char *func_name, uint32 argc, uint32 argv[])
9696
{
9797
struct ret_env tmp_module_env;
9898
WASMFunctionInstanceCommon *func_test = nullptr;
9999
bool ret = false;
100-
uint32 argv[1] = { 65535 };
101100
const char *exception = nullptr;
102-
SharedHeapInitArgs args;
103-
WASMSharedHeap *shared_heap = nullptr;
104101

105-
args.size = 1024;
106-
shared_heap = wasm_runtime_create_shared_heap(&args);
107-
tmp_module_env = load_wasm((char *)"test.wasm", 0);
102+
tmp_module_env = load_wasm((char *)file, 0);
108103

109-
if (!shared_heap) {
110-
printf("Failed to create shared heap\n");
111-
goto test_failed;
112-
}
113104
if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst, shared_heap)) {
114105
printf("Failed to attach shared heap\n");
115106
goto test_failed;
116107
}
117-
func_test = wasm_runtime_lookup_function(
118-
tmp_module_env.wasm_module_inst, "test");
108+
func_test = wasm_runtime_lookup_function(tmp_module_env.wasm_module_inst,
109+
func_name);
119110
if (!func_test) {
120111
printf("\nFailed to wasm_runtime_lookup_function!\n");
121112
goto test_failed;
122113
}
123114

124115
ret =
125-
wasm_runtime_call_wasm(tmp_module_env.exec_env, func_test, 1, argv);
116+
wasm_runtime_call_wasm(tmp_module_env.exec_env, func_test, argc, argv);
126117
if (!ret) {
127118
printf("\nFailed to wasm_runtime_call_wasm!\n");
128119
const char *s = wasm_runtime_get_exception(tmp_module_env.wasm_module_inst);
@@ -131,12 +122,119 @@ TEST_F(shared_heap_test, test_shared_heap)
131122
}
132123

133124
wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst);
134-
135-
EXPECT_EQ(10, argv[0]);
136-
137125
destroy_module_env(tmp_module_env);
138126
return;
139127
test_failed:
140128
destroy_module_env(tmp_module_env);
141129
EXPECT_EQ(1, 0);
142130
}
131+
132+
TEST_F(shared_heap_test, test_shared_heap_basic)
133+
{
134+
SharedHeapInitArgs args;
135+
WASMSharedHeap *shared_heap = nullptr;
136+
uint32 argv[1] = { 0 };
137+
138+
args.size = 1024;
139+
shared_heap = wasm_runtime_create_shared_heap(&args);
140+
141+
if (!shared_heap) {
142+
printf("Failed to create shared heap\n");
143+
EXPECT_EQ(1, 0);
144+
}
145+
146+
// test wasm
147+
test_shared_heap(shared_heap, "test.wasm", "test", 1, argv);
148+
EXPECT_EQ(10, argv[0]);
149+
150+
// test aot
151+
test_shared_heap(shared_heap, "test.aot", "test", 1, argv);
152+
EXPECT_EQ(10, argv[0]);
153+
154+
}
155+
156+
TEST_F(shared_heap_test, test_shared_heap_malloc_fail)
157+
{
158+
SharedHeapInitArgs args;
159+
WASMSharedHeap *shared_heap = nullptr;
160+
uint32 argv[1] = { 0 };
161+
162+
args.size = 1024;
163+
shared_heap = wasm_runtime_create_shared_heap(&args);
164+
165+
if (!shared_heap) {
166+
printf("Failed to create shared heap\n");
167+
EXPECT_EQ(1, 0);
168+
}
169+
170+
// test wasm
171+
test_shared_heap(shared_heap, "test.wasm", "test_malloc_fail", 1, argv);
172+
EXPECT_EQ(1, argv[0]);
173+
174+
// test aot
175+
test_shared_heap(shared_heap, "test.aot", "test_malloc_fail", 1, argv);
176+
EXPECT_EQ(1, argv[0]);
177+
}
178+
179+
#ifndef native_function
180+
#define native_function(func_name, signature) \
181+
{ #func_name, (void *)glue_##func_name, signature, NULL }
182+
183+
#endif
184+
#ifndef nitems
185+
#define nitems(_a) (sizeof(_a) / sizeof(0 [(_a)]))
186+
#endif /* nitems */
187+
uintptr_t glue_test_addr_conv(wasm_exec_env_t env, uintptr_t addr)
188+
{
189+
wasm_module_inst_t module_inst = get_module_inst(env);
190+
uintptr_t ret;
191+
void *native_addr = (void *)addr;
192+
uintptr_t app_addr = addr_native_to_app(native_addr);
193+
194+
native_addr = addr_app_to_native(app_addr);
195+
if (native_addr != (void *)addr)
196+
{
197+
EXPECT_EQ(1, 0);
198+
}
199+
return app_addr;
200+
}
201+
202+
static NativeSymbol g_test_native_symbols[] =
203+
{
204+
native_function(test_addr_conv,"(*)i"),
205+
};
206+
207+
TEST_F(shared_heap_test, test_addr_conv)
208+
{
209+
SharedHeapInitArgs args;
210+
WASMSharedHeap *shared_heap = nullptr;
211+
uint32 argv[1] = { 0 };
212+
struct ret_env tmp_module_env;
213+
WASMFunctionInstanceCommon *func_test = nullptr;
214+
bool ret = false;
215+
const char *exception = nullptr;
216+
wasm_module_inst_t module_inst = tmp_module_env.wasm_module_inst;
217+
218+
ret = wasm_native_register_natives("env", g_test_native_symbols,
219+
nitems(g_test_native_symbols));
220+
if (!ret)
221+
{
222+
EXPECT_EQ(1, 0);
223+
return;
224+
}
225+
226+
args.size = 1024;
227+
shared_heap = wasm_runtime_create_shared_heap(&args);
228+
if (!shared_heap) {
229+
printf("Failed to create shared heap\n");
230+
EXPECT_EQ(1, 0);
231+
}
232+
233+
// test wasm
234+
test_shared_heap(shared_heap, "test_addr_conv.wasm", "test", 1, argv);
235+
EXPECT_EQ(1, argv[0]);
236+
237+
// test aot
238+
test_shared_heap(shared_heap, "test_addr_conv.aot", "test", 1, argv);
239+
EXPECT_EQ(1, argv[0]);
240+
}

tests/unit/shared-heap/wasm-apps/CMakeLists.txt

+34-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ cmake_minimum_required(VERSION 3.14)
55
project(wasm-apps)
66

77
set(WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
8+
set(WAMRC_ROOT_DIR ${WAMR_ROOT_DIR}/wamr-compiler/build)
89

910
set(CMAKE_SYSTEM_PROCESSOR wasm32)
1011
set(CMAKE_SYSROOT ${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot)
@@ -36,4 +37,36 @@ add_custom_command(TARGET test.wasm POST_BUILD
3637
${CMAKE_CURRENT_BINARY_DIR}/test.wasm
3738
${CMAKE_CURRENT_BINARY_DIR}/../
3839
COMMENT "Copy test.wasm to the same directory of google test"
39-
)
40+
)
41+
42+
add_custom_command(TARGET test.wasm POST_BUILD
43+
COMMAND ${WAMRC_ROOT_DIR}/wamrc --opt-level=0 --enable-shared-heap --bounds-checks=1
44+
-o
45+
test.aot
46+
test.wasm
47+
COMMAND ${CMAKE_COMMAND} -E copy
48+
${CMAKE_CURRENT_BINARY_DIR}/test.aot
49+
${CMAKE_CURRENT_BINARY_DIR}/../
50+
COMMENT "Copy test.aot to the same directory of google test"
51+
)
52+
53+
add_executable(test_addr_conv.wasm test_addr_conv.c)
54+
target_link_libraries(test.wasm)
55+
56+
add_custom_command(TARGET test_addr_conv.wasm POST_BUILD
57+
COMMAND ${CMAKE_COMMAND} -E copy
58+
${CMAKE_CURRENT_BINARY_DIR}/test_addr_conv.wasm
59+
${CMAKE_CURRENT_BINARY_DIR}/../
60+
COMMENT "Copy test_addr_conv.wasm to the same directory of google test"
61+
)
62+
63+
add_custom_command(TARGET test_addr_conv.wasm POST_BUILD
64+
COMMAND ${WAMRC_ROOT_DIR}/wamrc --opt-level=0 --enable-shared-heap --bounds-checks=1
65+
-o
66+
test_addr_conv.aot
67+
test_addr_conv.wasm
68+
COMMAND ${CMAKE_COMMAND} -E copy
69+
${CMAKE_CURRENT_BINARY_DIR}/test_addr_conv.aot
70+
${CMAKE_CURRENT_BINARY_DIR}/../
71+
COMMENT "Copy test_addr_conv.aot to the same directory of google test"
72+
)

tests/unit/shared-heap/wasm-apps/test.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,22 @@ shared_heap_free(void *offset);
1313
int
1414
test()
1515
{
16-
int *ptr = (int *)shared_heap_malloc(10);
16+
int *ptr = (int *)shared_heap_malloc(4);
1717

1818
*ptr = 10;
1919
int a = *ptr;
2020
shared_heap_free(ptr);
2121
return a;
2222
}
23+
24+
int
25+
test_malloc_fail()
26+
{
27+
int *ptr = (int *)shared_heap_malloc(8192);
28+
29+
if (ptr == NULL) {
30+
return 1;
31+
}
32+
shared_heap_free(ptr);
33+
return 0;
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (C) 2024 Xiaomi Corporation. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
*/
5+
6+
#include <stdio.h>
7+
8+
extern void *
9+
shared_heap_malloc(int size);
10+
extern void
11+
shared_heap_free(void *offset);
12+
extern void *
13+
test_addr_conv(void *ptr);
14+
15+
int
16+
test()
17+
{
18+
int *ptr = NULL;
19+
int *ptr2 = NULL;
20+
21+
ptr = (int *)shared_heap_malloc(4);
22+
23+
if (ptr == NULL) {
24+
return 0;
25+
}
26+
ptr2 = test_addr_conv(ptr);
27+
if (ptr2 != ptr) {
28+
return 0;
29+
}
30+
shared_heap_free(ptr);
31+
return 1;
32+
}

0 commit comments

Comments
 (0)