@@ -70,6 +70,31 @@ typedef float64 CellType_F64;
7070 goto unaligned_atomic; \
7171 } while (0)
7272
73+ #if WASM_ENABLE_DEBUG_INTERP != 0
74+ #define TRIGGER_WATCHPOINT_SIGTRAP () \
75+ wasm_cluster_thread_send_signal(exec_env, WAMR_SIG_TRAP); \
76+ CHECK_SUSPEND_FLAGS();
77+
78+ #define CHECK_WATCHPOINT (list , current_addr ) \
79+ WASMDebugWatchPoint *watchpoint = bh_list_first_elem(list); \
80+ while (watchpoint) { \
81+ WASMDebugWatchPoint *next = bh_list_elem_next(watchpoint); \
82+ if (watchpoint->addr <= current_addr \
83+ && watchpoint->addr + watchpoint->length > current_addr) { \
84+ TRIGGER_WATCHPOINT_SIGTRAP() \
85+ } \
86+ watchpoint = next; \
87+ }
88+
89+ #define CHECK_READ_WATCHPOINT (addr , offset ) \
90+ CHECK_WATCHPOINT(watch_point_list_read, WASM_ADDR_OFFSET(addr + offset))
91+ #define CHECK_WRITE_WATCHPOINT (addr , offset ) \
92+ CHECK_WATCHPOINT(watch_point_list_write, WASM_ADDR_OFFSET(addr + offset))
93+ #else
94+ #define CHECK_READ_WATCHPOINT (addr , offset )
95+ #define CHECK_WRITE_WATCHPOINT (addr , offset )
96+ #endif
97+
7398static inline uint32
7499rotl32 (uint32 n , uint32 c )
75100{
@@ -1120,6 +1145,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
11201145
11211146#if WASM_ENABLE_DEBUG_INTERP != 0
11221147 uint8 * frame_ip_orig = NULL ;
1148+ WASMDebugInstance * debug_instance = wasm_exec_env_get_instance (exec_env );
1149+ bh_list * watch_point_list_read = & debug_instance -> watch_point_list_read ;
1150+ bh_list * watch_point_list_write = & debug_instance -> watch_point_list_write ;
11231151#endif
11241152
11251153#if WASM_ENABLE_LABELS_AS_VALUES != 0
@@ -1786,6 +1814,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
17861814 CHECK_MEMORY_OVERFLOW (4 );
17871815 PUSH_I32 (LOAD_I32 (maddr ));
17881816 (void )flags ;
1817+ CHECK_READ_WATCHPOINT (addr , offset );
17891818 HANDLE_OP_END ();
17901819 }
17911820
@@ -1800,6 +1829,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18001829 CHECK_MEMORY_OVERFLOW (8 );
18011830 PUSH_I64 (LOAD_I64 (maddr ));
18021831 (void )flags ;
1832+ CHECK_READ_WATCHPOINT (addr , offset );
18031833 HANDLE_OP_END ();
18041834 }
18051835
@@ -1813,6 +1843,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18131843 CHECK_MEMORY_OVERFLOW (1 );
18141844 PUSH_I32 (sign_ext_8_32 (* (int8 * )maddr ));
18151845 (void )flags ;
1846+ CHECK_READ_WATCHPOINT (addr , offset );
18161847 HANDLE_OP_END ();
18171848 }
18181849
@@ -1826,6 +1857,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18261857 CHECK_MEMORY_OVERFLOW (1 );
18271858 PUSH_I32 ((uint32 )(* (uint8 * )maddr ));
18281859 (void )flags ;
1860+ CHECK_READ_WATCHPOINT (addr , offset );
18291861 HANDLE_OP_END ();
18301862 }
18311863
@@ -1839,6 +1871,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18391871 CHECK_MEMORY_OVERFLOW (2 );
18401872 PUSH_I32 (sign_ext_16_32 (LOAD_I16 (maddr )));
18411873 (void )flags ;
1874+ CHECK_READ_WATCHPOINT (addr , offset );
18421875 HANDLE_OP_END ();
18431876 }
18441877
@@ -1852,6 +1885,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18521885 CHECK_MEMORY_OVERFLOW (2 );
18531886 PUSH_I32 ((uint32 )(LOAD_U16 (maddr )));
18541887 (void )flags ;
1888+ CHECK_READ_WATCHPOINT (addr , offset );
18551889 HANDLE_OP_END ();
18561890 }
18571891
@@ -1865,6 +1899,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18651899 CHECK_MEMORY_OVERFLOW (1 );
18661900 PUSH_I64 (sign_ext_8_64 (* (int8 * )maddr ));
18671901 (void )flags ;
1902+ CHECK_READ_WATCHPOINT (addr , offset );
18681903 HANDLE_OP_END ();
18691904 }
18701905
@@ -1878,6 +1913,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18781913 CHECK_MEMORY_OVERFLOW (1 );
18791914 PUSH_I64 ((uint64 )(* (uint8 * )maddr ));
18801915 (void )flags ;
1916+ CHECK_READ_WATCHPOINT (addr , offset );
18811917 HANDLE_OP_END ();
18821918 }
18831919
@@ -1891,6 +1927,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
18911927 CHECK_MEMORY_OVERFLOW (2 );
18921928 PUSH_I64 (sign_ext_16_64 (LOAD_I16 (maddr )));
18931929 (void )flags ;
1930+ CHECK_READ_WATCHPOINT (addr , offset );
18941931 HANDLE_OP_END ();
18951932 }
18961933
@@ -1904,6 +1941,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19041941 CHECK_MEMORY_OVERFLOW (2 );
19051942 PUSH_I64 ((uint64 )(LOAD_U16 (maddr )));
19061943 (void )flags ;
1944+ CHECK_READ_WATCHPOINT (addr , offset );
19071945 HANDLE_OP_END ();
19081946 }
19091947
@@ -1918,6 +1956,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19181956 CHECK_MEMORY_OVERFLOW (4 );
19191957 PUSH_I64 (sign_ext_32_64 (LOAD_I32 (maddr )));
19201958 (void )flags ;
1959+ CHECK_READ_WATCHPOINT (addr , offset );
19211960 HANDLE_OP_END ();
19221961 }
19231962
@@ -1931,6 +1970,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19311970 CHECK_MEMORY_OVERFLOW (4 );
19321971 PUSH_I64 ((uint64 )(LOAD_U32 (maddr )));
19331972 (void )flags ;
1973+ CHECK_READ_WATCHPOINT (addr , offset );
19341974 HANDLE_OP_END ();
19351975 }
19361976
@@ -1947,6 +1987,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19471987 CHECK_MEMORY_OVERFLOW (4 );
19481988 STORE_U32 (maddr , frame_sp [1 ]);
19491989 (void )flags ;
1990+ CHECK_WRITE_WATCHPOINT (addr , offset );
19501991 HANDLE_OP_END ();
19511992 }
19521993
@@ -1963,6 +2004,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19632004 PUT_I64_TO_ADDR ((uint32 * )maddr ,
19642005 GET_I64_FROM_ADDR (frame_sp + 1 ));
19652006 (void )flags ;
2007+ CHECK_WRITE_WATCHPOINT (addr , offset );
19662008 HANDLE_OP_END ();
19672009 }
19682010
@@ -1988,6 +2030,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
19882030 }
19892031
19902032 (void )flags ;
2033+ CHECK_WRITE_WATCHPOINT (addr , offset );
19912034 HANDLE_OP_END ();
19922035 }
19932036
@@ -2017,6 +2060,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
20172060 STORE_U32 (maddr , (uint32 )sval );
20182061 }
20192062 (void )flags ;
2063+ CHECK_WRITE_WATCHPOINT (addr , offset );
20202064 HANDLE_OP_END ();
20212065 }
20222066
0 commit comments