mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 13:17:31 +00:00 
			
		
		
		
	Fix threads spec test issues (#1586)
This commit is contained in:
		
							parent
							
								
									5a93f0d667
								
							
						
					
					
						commit
						826cf4f8e1
					
				|  | @ -323,7 +323,13 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, | |||
|         WASMModuleInstance *module_inst = (WASMModuleInstance *)module; | ||||
|         /* Currently we have only one memory instance */ | ||||
|         if (!module_inst->memories[0]->is_shared) { | ||||
|             wasm_runtime_set_exception(module, "wait on unshared memory"); | ||||
|             wasm_runtime_set_exception(module, "expected shared memory"); | ||||
|             return -1; | ||||
|         } | ||||
|         if ((uint8 *)address < module_inst->memories[0]->memory_data | ||||
|             || (uint8 *)address + (wait64 ? 8 : 4) | ||||
|                    > module_inst->memories[0]->memory_data_end) { | ||||
|             wasm_runtime_set_exception(module, "out of bounds memory access"); | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
|  | @ -335,7 +341,13 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, | |||
|             ((AOTMemoryInstance **)aot_inst->memories.ptr)[0]; | ||||
|         /* Currently we have only one memory instance */ | ||||
|         if (!aot_memory->is_shared) { | ||||
|             wasm_runtime_set_exception(module, "wait on unshared memory"); | ||||
|             wasm_runtime_set_exception(module, "expected shared memory"); | ||||
|             return -1; | ||||
|         } | ||||
|         if ((uint8 *)address < (uint8 *)aot_memory->memory_data.ptr | ||||
|             || (uint8 *)address + (wait64 ? 8 : 4) | ||||
|                    > (uint8 *)aot_memory->memory_data_end.ptr) { | ||||
|             wasm_runtime_set_exception(module, "out of bounds memory access"); | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
|  | @ -424,6 +436,31 @@ wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, | |||
|     uint32 notify_result; | ||||
|     AtomicWaitInfo *wait_info; | ||||
| 
 | ||||
| #if WASM_ENABLE_INTERP != 0 | ||||
|     if (module->module_type == Wasm_Module_Bytecode) { | ||||
|         WASMModuleInstance *module_inst = (WASMModuleInstance *)module; | ||||
|         if ((uint8 *)address < module_inst->memories[0]->memory_data | ||||
|             || (uint8 *)address + 4 | ||||
|                    > module_inst->memories[0]->memory_data_end) { | ||||
|             wasm_runtime_set_exception(module, "out of bounds memory access"); | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
| #if WASM_ENABLE_AOT != 0 | ||||
|     if (module->module_type == Wasm_Module_AoT) { | ||||
|         AOTModuleInstance *aot_inst = (AOTModuleInstance *)module; | ||||
|         AOTMemoryInstance *aot_memory = | ||||
|             ((AOTMemoryInstance **)aot_inst->memories.ptr)[0]; | ||||
|         if ((uint8 *)address < (uint8 *)aot_memory->memory_data.ptr | ||||
|             || (uint8 *)address + 4 | ||||
|                    > (uint8 *)aot_memory->memory_data_end.ptr) { | ||||
|             wasm_runtime_set_exception(module, "out of bounds memory access"); | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     wait_info = acquire_wait_info(address, false); | ||||
| 
 | ||||
|     /* Nobody wait on this address */ | ||||
|  |  | |||
|  | @ -1217,6 +1217,10 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index) | |||
|                                 comp_ctx, func_ctx, align, offset, bytes)) | ||||
|                             return false; | ||||
|                         break; | ||||
|                     case WASM_OP_ATOMIC_FENCE: | ||||
|                         /* Skip memory index */ | ||||
|                         frame_ip++; | ||||
|                         break; | ||||
|                     case WASM_OP_ATOMIC_I32_LOAD: | ||||
|                         bytes = 4; | ||||
|                         goto op_atomic_i32_load; | ||||
|  |  | |||
|  | @ -2052,6 +2052,10 @@ jit_compile_func(JitCompContext *cc) | |||
|                                                            bytes)) | ||||
|                             return false; | ||||
|                         break; | ||||
|                     case WASM_OP_ATOMIC_FENCE: | ||||
|                         /* Skip memory index */ | ||||
|                         frame_ip++; | ||||
|                         break; | ||||
|                     case WASM_OP_ATOMIC_I32_LOAD: | ||||
|                         bytes = 4; | ||||
|                         goto op_atomic_i32_load; | ||||
|  |  | |||
|  | @ -3335,12 +3335,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | |||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||
|             HANDLE_OP(WASM_OP_ATOMIC_PREFIX) | ||||
|             { | ||||
|                 uint32 offset, align, addr; | ||||
|                 uint32 offset = 0, align, addr; | ||||
| 
 | ||||
|                 opcode = *frame_ip++; | ||||
| 
 | ||||
|                 read_leb_uint32(frame_ip, frame_ip_end, align); | ||||
|                 read_leb_uint32(frame_ip, frame_ip_end, offset); | ||||
|                 if (opcode != WASM_OP_ATOMIC_FENCE) { | ||||
|                     read_leb_uint32(frame_ip, frame_ip_end, align); | ||||
|                     read_leb_uint32(frame_ip, frame_ip_end, offset); | ||||
|                 } | ||||
| 
 | ||||
|                 switch (opcode) { | ||||
|                     case WASM_OP_ATOMIC_NOTIFY: | ||||
|                     { | ||||
|  | @ -3399,6 +3402,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | |||
|                         PUSH_I32(ret); | ||||
|                         break; | ||||
|                     } | ||||
|                     case WASM_OP_ATOMIC_FENCE: | ||||
|                     { | ||||
|                         /* Skip the memory index */ | ||||
|                         frame_ip++; | ||||
|                         break; | ||||
|                     } | ||||
| 
 | ||||
|                     case WASM_OP_ATOMIC_I32_LOAD: | ||||
|                     case WASM_OP_ATOMIC_I32_LOAD8_U: | ||||
|  |  | |||
|  | @ -3227,11 +3227,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | |||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||
|             HANDLE_OP(WASM_OP_ATOMIC_PREFIX) | ||||
|             { | ||||
|                 uint32 offset, addr; | ||||
|                 uint32 offset = 0, addr; | ||||
| 
 | ||||
|                 GET_OPCODE(); | ||||
| 
 | ||||
|                 offset = read_uint32(frame_ip); | ||||
|                 if (opcode != WASM_OP_ATOMIC_FENCE) { | ||||
|                     offset = read_uint32(frame_ip); | ||||
|                 } | ||||
| 
 | ||||
|                 switch (opcode) { | ||||
|                     case WASM_OP_ATOMIC_NOTIFY: | ||||
|  |  | |||
|  | @ -0,0 +1,49 @@ | |||
| diff --git a/test/core/atomic.wast b/test/core/atomic.wast
 | ||||
| index 66ad0eb..40259a9 100644
 | ||||
| --- a/test/core/atomic.wast
 | ||||
| +++ b/test/core/atomic.wast
 | ||||
| @@ -324,7 +324,7 @@
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i32.atomic.rmw8.cmpxchg_u" (i32.const 0) (i32.const 0x11111111) (i32.const 0xcdcdcdcd)) (i32.const 0x11)) | ||||
| -(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
 | ||||
| +(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x11111111111111cd))
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i32.atomic.rmw16.cmpxchg_u" (i32.const 0) (i32.const 0) (i32.const 0xcafecafe)) (i32.const 0x1111)) | ||||
| @@ -332,7 +332,7 @@
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i32.atomic.rmw16.cmpxchg_u" (i32.const 0) (i32.const 0x11111111) (i32.const 0xcafecafe)) (i32.const 0x1111)) | ||||
| -(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
 | ||||
| +(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x111111111111cafe))
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw8.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0x4242424242424242)) (i64.const 0x11)) | ||||
| @@ -340,7 +340,7 @@
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw8.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0x4242424242424242)) (i64.const 0x11)) | ||||
| -(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
 | ||||
| +(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111142))
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0xbeefbeefbeefbeef)) (i64.const 0x1111)) | ||||
| @@ -348,7 +348,7 @@
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0xbeefbeefbeefbeef)) (i64.const 0x1111)) | ||||
| -(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
 | ||||
| +(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x111111111111beef))
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0xcabba6e5cabba6e5)) (i64.const 0x11111111)) | ||||
| @@ -356,7 +356,7 @@
 | ||||
|   | ||||
|  (invoke "init" (i64.const 0x1111111111111111)) | ||||
|  (assert_return (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0xcabba6e5cabba6e5)) (i64.const 0x11111111)) | ||||
| -(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
 | ||||
| +(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x11111111cabba6e5))
 | ||||
|   | ||||
|  ;; *.atomic.rmw*.cmpxchg (compare true) | ||||
|   | ||||
|  | @ -308,6 +308,7 @@ function spec_test() | |||
|         git checkout threads/main | ||||
| 
 | ||||
|         git apply ../../spec-test-script/thread_proposal_ignore_cases.patch | ||||
|         git apply ../../spec-test-script/thread_proposal_fix_atomic_case.patch | ||||
|     fi | ||||
| 
 | ||||
|     popd | ||||
|  | @ -383,6 +384,10 @@ function spec_test() | |||
| 
 | ||||
|     if [[ ${ENABLE_MULTI_THREAD} == 1 ]]; then | ||||
|         ARGS_FOR_SPEC_TEST+="-p " | ||||
|         if [[ $1 == 'fast-jit' ]]; then | ||||
|           echo "fast-jit doesn't support multi-thread feature yet, skip it" | ||||
|           return | ||||
|         fi | ||||
|     fi | ||||
| 
 | ||||
|     if [[ ${ENABLE_XIP} == 1 ]]; then | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Xu Jun
						Xu Jun