5#ifndef V8_WASM_INTERPRETER_WASM_INTERPRETER_RUNTIME_H_
6#define V8_WASM_INTERPRETER_WASM_INTERPRETER_RUNTIME_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
22class WasmInstanceObject;
25class InterpreterTracer;
26class WasmBytecodeGenerator;
56 bool MemoryInit(
const uint8_t*& current_code, uint32_t data_segment_index,
57 uint64_t dst, uint64_t src, uint64_t size);
58 bool MemoryCopy(
const uint8_t*& current_code, uint64_t dst, uint64_t src,
60 bool MemoryFill(
const uint8_t*& current_code, uint64_t dst, uint32_t value,
64 int32_t
AtomicNotify(uint64_t effective_index, int32_t val);
65 int32_t
I32AtomicWait(uint64_t effective_index, int32_t val, int64_t timeout);
66 int32_t
I64AtomicWait(uint64_t effective_index, int64_t val, int64_t timeout);
69 const uint8_t*& code);
71 bool TableGet(
const uint8_t*& current_code, uint32_t table_index,
73 void TableSet(
const uint8_t*& current_code, uint32_t table_index,
75 void TableInit(
const uint8_t*& current_code, uint32_t table_index,
76 uint32_t element_segment_index, uint32_t dst, uint32_t src,
78 void TableCopy(
const uint8_t*& current_code, uint32_t dst_table_index,
79 uint32_t src_table_index, uint32_t dst, uint32_t src,
81 uint32_t
TableGrow(uint32_t table_index, uint32_t delta,
84 void TableFill(
const uint8_t*& current_code, uint32_t table_index,
89 uint32_t table_index);
92 uint32_t table_index, uint32_t entry_index);
96 inline void DataDrop(uint32_t index);
97 inline void ElemDrop(uint32_t index);
106 uint32_t first_param_slot_index,
107 uint32_t first_param_ref_stack_index);
111 uint32_t catch_block_index);
114 Address frame_pointer, uint8_t* interpreter_fp,
115 uint32_t ref_stack_offset,
116 const std::vector<WasmValue>* argument_values =
nullptr);
120 uint32_t current_stack_size,
121 uint32_t ref_stack_fp_offset,
122 uint32_t slot_offset,
123 uint32_t return_slot_offset,
124 bool is_tail_call =
false);
127 uint32_t current_stack_size,
128 uint32_t return_slot_offset);
131 uint32_t current_stack_size,
132 uint32_t ref_stack_fp_offset, uint32_t slot_offset,
133 uint32_t return_slot_offset);
136 uint32_t sig_index, uint32_t entry_index,
137 uint32_t stack_pos, uint32_t*
sp,
138 uint32_t ref_stack_fp_offset, uint32_t slot_offset,
139 uint32_t return_slot_offset,
bool is_tail_call);
142 uint32_t sig_index, uint32_t stack_pos, uint32_t*
sp,
143 uint32_t ref_stack_fp_offset, uint32_t slot_offset,
144 uint32_t return_slot_offset,
bool is_tail_call);
156 uint32_t rets_size, uint32_t args_size,
157 uint32_t rets_refs, uint32_t args_refs,
158 uint32_t ref_stack_fp_offset);
168 uint32_t index)
const;
170 uint32_t length, uint32_t array_index)
const;
172 uint32_t
offset, uint32_t length);
177 WasmRef src_wasm_array, uint32_t src_index,
180 uint32_t canonical_index)
const;
186 uint32_t index)
const;
214#ifdef V8_ENABLE_DRUMBRAKE_TRACING
215 void Trace(
const char* format, ...);
229 uint32_t function_index, uint32_t*
sp,
230 uint32_t current_stack_size,
231 uint32_t ref_stack_fp_index,
232 uint32_t current_slot_offset);
240 uint32_t return_slot_offset);
257 uint32_t sig_index)
const;
267 uint32_t*
sp,
const uint8_t*& current_code);
269 uint32_t index)
const;
272 uint32_t type_index)
const;
309#pragma clang diagnostic push
310#pragma clang diagnostic ignored "-Wunused-private-field"
314#pragma clang diagnostic pop
360#ifdef V8_ENABLE_DRUMBRAKE_TRACING
361 void TracePop() { shadow_stack_->TracePop(); }
366 return TracePush<int32_t>(slot_offset);
368 return TracePush<int64_t>(slot_offset);
370 return TracePush<float>(slot_offset);
372 return TracePush<double>(slot_offset);
374 return TracePush<Simd128>(slot_offset);
377 return TracePush<WasmRef>(slot_offset);
382 template <
typename T>
383 size_t TracePush(uint32_t slot_offset) {
384 shadow_stack_->TracePush<T>(slot_offset);
388 void TracePushCopy(uint32_t from_index) {
389 shadow_stack_->TracePushCopy(from_index);
392 void TraceUpdate(uint32_t stack_index, uint32_t slot_offset) {
393 shadow_stack_->TraceUpdate(stack_index, slot_offset);
396 void TraceSetSlotType(uint32_t stack_index, uint32_t type) {
397 shadow_stack_->TraceSetSlotType(stack_index, type);
401 InterpreterTracer* GetTracer();
403 std::unique_ptr<InterpreterTracer> tracer_;
404 ShadowStack* shadow_stack_;
425 const std::vector<WasmValue>& argument_values,
426 std::vector<WasmValue>& return_values);
428 uint32_t func_index, uint8_t* interpreter_fp);
435 std::vector<WasmInterpreterStackEntry> GetInterpretedStack(
436 Address frame_pointer);
438 int GetFunctionIndex(Address frame_pointer,
int index)
const;
440 void SetTrapFunctionIndex(int32_t func_index);
WasmInterpreter interpreter_
const WasmModule * module() const
InterpreterHandle(const InterpreterHandle &)=delete
InterpreterHandle & operator=(const InterpreterHandle &)=delete
const WasmModule * module_
WasmInterpreter * interpreter()
std::vector< IndirectCallValue > IndirectCallTable
DirectHandle< Object > GetGlobalRef(uint32_t index) const
void SetTrap(TrapReason trap_reason, pc_t trap_pc)
std::vector< WasmInterpreterStackEntry > GetInterpretedStack(Address frame_pointer)
void TableCopy(const uint8_t *¤t_code, uint32_t dst_table_index, uint32_t src_table_index, uint32_t dst, uint32_t src, uint32_t size)
Address EffectiveAddress(uint64_t index) const
void PrepareTailCall(const uint8_t *&code, uint32_t func_index, uint32_t current_stack_size, uint32_t return_slot_offset)
DirectHandle< WasmTrustedInstanceData > wasm_trusted_instance_data() const
WasmInterpreterRuntime & operator=(const WasmInterpreterRuntime &)=delete
bool WasmArrayCopy(WasmRef dest_wasm_array, uint32_t dest_index, WasmRef src_wasm_array, uint32_t src_index, uint32_t length)
void BeginExecution(WasmInterpreterThread *thread, uint32_t function_index, Address frame_pointer, uint8_t *interpreter_fp, uint32_t ref_stack_offset, const std::vector< WasmValue > *argument_values=nullptr)
static void ClearIndirectCallCacheEntry(Isolate *isolate, DirectHandle< WasmInstanceObject > instance, uint32_t table_index, uint32_t entry_index)
void StoreRefArgsIntoStackSlots(uint8_t *sp, uint32_t ref_stack_fp_offset, const FunctionSig *sig)
int32_t MemoryGrow(uint32_t delta_pages)
void UnwindCurrentStackFrame(uint32_t *sp, uint32_t slot_offset, uint32_t rets_size, uint32_t args_size, uint32_t rets_refs, uint32_t args_refs, uint32_t ref_stack_fp_offset)
void RethrowException(const uint8_t *&code, uint32_t *sp, uint32_t catch_block_index)
bool MemoryInit(const uint8_t *¤t_code, uint32_t data_segment_index, uint64_t dst, uint64_t src, uint64_t size)
WasmInterpreterThread * thread() const
std::pair< DirectHandle< WasmArray >, const ArrayType * > ArrayNewUninitialized(uint32_t length, uint32_t array_index) const
void TableSet(const uint8_t *¤t_code, uint32_t table_index, uint32_t entry_index, DirectHandle< Object > ref)
Tagged< Object > GetNullValue(const ValueType obj_type) const
uint64_t MemorySize() const
void ExecuteFunction(const uint8_t *&code, uint32_t function_index, uint32_t current_stack_size, uint32_t ref_stack_fp_offset, uint32_t slot_offset, uint32_t return_slot_offset)
WasmRef JSToWasmObject(WasmRef extern_ref, ValueType value_type) const
std::vector< uint8_t * > global_addresses_
WasmInterpreterRuntime(const WasmInterpreterRuntime &)=delete
bool RefIsArray(const WasmRef obj, const ValueType obj_type, bool null_succeeds) const
bool RefIsString(const WasmRef obj, const ValueType obj_type, bool null_succeeds) const
DirectHandle< Object > GetFunctionRef(uint32_t index) const
uint32_t TableGrow(uint32_t table_index, uint32_t delta, DirectHandle< Object > value)
static void UpdateIndirectCallTable(Isolate *isolate, DirectHandle< WasmInstanceObject > instance, uint32_t table_index)
IndirectHandle< WasmInstanceObject > instance_object_
ExternalCallResult CallExternalJSFunction(const uint8_t *¤t_code, const WasmModule *module, DirectHandle< Object > object_ref, const FunctionSig *sig, uint32_t *sp, uint32_t return_slot_offset)
WasmBytecode * GetFunctionBytecode(uint32_t func_index)
base::TimeTicks fuzzer_start_time_
void ThrowException(const uint8_t *&code, uint32_t *sp, Tagged< Object > exception_object)
void ExecuteImportedFunction(const uint8_t *&code, uint32_t func_index, uint32_t current_stack_size, uint32_t ref_stack_fp_offset, uint32_t slot_offset, uint32_t return_slot_offset, bool is_tail_call=false)
std::vector< IndirectCallTable > indirect_call_tables_
void StoreWasmRef(uint32_t ref_stack_index, const WasmRef &ref)
void PurgeIndirectCallCache(uint32_t table_index)
WasmInterpreter::CodeMap * codemap_
Isolate * GetIsolate() const
const WasmModule * module_
static void UpdateMemoryAddress(DirectHandle< WasmInstanceObject > instance)
static bool IsNull(Isolate *isolate, const WasmRef obj, const ValueType obj_type)
ExternalCallResult CallImportedFunction(const uint8_t *¤t_code, uint32_t function_index, uint32_t *sp, uint32_t current_stack_size, uint32_t ref_stack_fp_index, uint32_t current_slot_offset)
WasmInterpreterThread * current_thread_
DirectHandle< Object > GetWasmArrayRefElement(Tagged< WasmArray > array, uint32_t index) const
uint8_t * GetMemoryStart() const
const WasmValue & GetReturnValue(size_t index) const
bool MemoryCopy(const uint8_t *¤t_code, uint64_t dst, uint64_t src, uint64_t size)
bool SubtypeCheck(const WasmRef obj, const ValueType obj_type, const DirectHandle< Map > rtt, const ModuleTypeIndex target_type, bool null_succeeds) const
GeneratedCode< WasmToJSCallSig > generic_wasm_to_js_interpreter_wrapper_fn_
void InitializeRefLocalsRefs(const WasmBytecode *target_function)
bool CheckIndirectCallSignature(uint32_t table_index, uint32_t entry_index, uint32_t sig_index) const
void InitMemoryAddresses()
WasmRef WasmArrayNewSegment(uint32_t array_index, uint32_t segment_index, uint32_t offset, uint32_t length)
bool RefIsI31(const WasmRef obj, const ValueType obj_type, bool null_succeeds) const
DirectHandle< Map > RttCanon(uint32_t type_index) const
WasmInterpreterThread::ExceptionHandlingResult HandleException(uint32_t *sp, const uint8_t *¤t_code)
bool MatchingExceptionTag(DirectHandle< Object > exception_object, uint32_t index) const
int GetFunctionIndex(Address frame_pointer, int index) const
bool RefIsStruct(const WasmRef obj, const ValueType obj_type, bool null_succeeds) const
void DataDrop(uint32_t index)
WasmInterpreterRuntime(const WasmModule *module, Isolate *isolate, IndirectHandle< WasmInstanceObject > instance_object, WasmInterpreter::CodeMap *codemap)
void PrintStack(uint32_t *sp, RegMode reg_mode, int64_t r0, double fp0)
const ArrayType * GetArrayType(uint32_t array_index) const
void ExecuteCallRef(const uint8_t *¤t_code, WasmRef func_ref, uint32_t sig_index, uint32_t stack_pos, uint32_t *sp, uint32_t ref_stack_fp_offset, uint32_t slot_offset, uint32_t return_slot_offset, bool is_tail_call)
bool RefIsEq(const WasmRef obj, const ValueType obj_type, bool null_succeeds) const
int32_t AtomicNotify(uint64_t effective_index, int32_t val)
bool TableGet(const uint8_t *¤t_code, uint32_t table_index, uint32_t entry_index, DirectHandle< Object > *result)
PWasmOp *const * instruction_table_
void InitGlobalAddressCache()
bool WasmStackCheck(const uint8_t *current_bytecode, const uint8_t *&code)
void InitIndirectFunctionTables()
WasmInterpreterThread::State state() const
void ElemDrop(uint32_t index)
FrameState current_frame_
void TableFill(const uint8_t *¤t_code, uint32_t table_index, uint32_t count, DirectHandle< Object > value, uint32_t start)
bool BoundsCheckMemRange(uint64_t index, uint64_t *size, Address *out_address) const
std::pair< DirectHandle< WasmStruct >, const StructType * > StructNewUninitialized(uint32_t index) const
void StoreRefResultsIntoRefStack(uint8_t *sp, uint32_t ref_stack_fp_offset, const FunctionSig *sig)
int32_t I32AtomicWait(uint64_t effective_index, int32_t val, int64_t timeout)
WasmRef ExtractWasmRef(uint32_t ref_stack_index)
bool IsRefNull(DirectHandle< Object > ref) const
void ExecuteIndirectCall(const uint8_t *¤t_code, uint32_t table_index, uint32_t sig_index, uint32_t entry_index, uint32_t stack_pos, uint32_t *sp, uint32_t ref_stack_fp_offset, uint32_t slot_offset, uint32_t return_slot_offset, bool is_tail_call)
bool MemoryFill(const uint8_t *¤t_code, uint64_t dst, uint32_t value, uint64_t size)
Address(Address js_function, Address packed_args, Address saved_c_entry_fp, const FunctionSig *sig, Address c_entry_fp, Address callable) WasmToJSCallSig
void ContinueExecution(WasmInterpreterThread *thread, bool called_from_js)
bool AllowsAtomicsWait() const
WasmRef WasmJSToWasmObject(WasmRef extern_ref, ValueType value_type, uint32_t canonical_index) const
static int instruction_table_offset()
int32_t I64AtomicWait(uint64_t effective_index, int64_t val, int64_t timeout)
void TableInit(const uint8_t *¤t_code, uint32_t table_index, uint32_t element_segment_index, uint32_t dst, uint32_t src, uint32_t size)
DirectHandle< FixedArray > reference_stack() const
uint32_t TableSize(uint32_t table_index)
void SetTrapFunctionIndex(int32_t func_index)
const WasmTag & GetWasmTag(uint32_t tag_index) const
std::vector< WasmValue > function_result_
DirectHandle< WasmExceptionPackage > CreateWasmExceptionPackage(uint32_t tag_index) const
size_t TotalBytecodeSize() const
static int memory_start_offset()
bool WasmArrayInitSegment(uint32_t segment_index, WasmRef wasm_array, uint32_t array_offset, uint32_t segment_offset, uint32_t length)
WasmRef WasmToJSObject(WasmRef ref) const
void CallWasmToJSBuiltin(Isolate *isolate, DirectHandle< Object > object_ref, Address packed_args, const FunctionSig *sig)
void ResetCurrentHandleScope()
void SetGlobalRef(uint32_t index, DirectHandle< Object > ref) const
size_t GetMemorySize() const
void UnpackException(uint32_t *sp, const WasmTag &tag, DirectHandle< Object > exception_object, uint32_t first_param_slot_index, uint32_t first_param_ref_stack_index)
uint32_t start_function_index_
uint8_t * GetGlobalAddress(uint32_t index)
bool IsNullTypecheck(const WasmRef obj, const ValueType obj_type) const
Handle< FixedArray > reference_stack() const
size_t TotalBytecodeSize()
ZoneVector< RpoNumber > & result
WordWithBits< 128 > Simd128
static ValueType value_type()
uint32_t WasmInterpreterRuntime int64_t r0
uint32_t WasmInterpreterRuntime int64_t double fp0
constexpr size_t kV8MaxWasmFunctionParams
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset instance_object
const size_t segment_offset
#define DCHECK_NOT_NULL(val)
#define DCHECK_LT(v1, v2)
#define V8_EXPORT_PRIVATE
static const uint32_t kInlineSignatureSentinel
IndirectCallValue(const FunctionSig *signature_, wasm::CanonicalTypeIndex sig_index)
const FunctionSig * signature
IndirectCallValue(uint32_t func_index_, wasm::CanonicalTypeIndex sig_index)
wasm::CanonicalTypeIndex sig_index
static const uint32_t kInvalidFunctionIndex
const wasm::WasmModule * module_