32 std::string module_name;
33 if (wasm_script->Name().ToLocal(&name)) {
45 if (weak_instance_list->length() > 0) {
47 if (maybe_instance.
IsWeak()) {
59 while (module_bytes[index] & 0x80) index++;
65 uint8_t opcode = wire_bytes[
pc];
67 case kExprCallFunction: {
73 case kExprCallIndirect: {
88 uint32_t debug_context_id,
Isolate* isolate) {
89 std::vector<wasm_addr_t> call_stack;
93 switch (frame->
type()) {
94 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION:
95 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH:
96 case StackFrame::INTERPRETED:
97 case StackFrame::BASELINE:
98 case StackFrame::MAGLEV:
99 case StackFrame::TURBOFAN_JS:
100 case StackFrame::BUILTIN:
101 case StackFrame::WASM: {
104 for (
size_t i = summaries.
size();
i-- != 0;) {
108 auto& summary = summaries.
frames[
i];
109 if (summary.IsJavaScript()) {
111 summary.AsJavaScript();
114 }
else if (summary.IsWasm()) {
115 FrameSummary::WasmFrameSummary
const&
wasm = summary.AsWasm();
117 wasm.function_index()) +
119 script =
wasm.script();
121 bool zeroth_frame = call_stack.empty();
124 wasm.wasm_instance()->module_object().native_module();
130 call_stack.push_back(
131 {debug_context_id << 16 | script->id(), uint32_t(
offset)});
137 case StackFrame::BUILTIN_EXIT:
143 if (call_stack.empty()) call_stack.push_back({1, 0});
150 while (!frame_it->
done()) {
152 switch (frame->
type()) {
153 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION:
154 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH:
155 case StackFrame::INTERPRETED:
156 case StackFrame::BASELINE:
157 case StackFrame::MAGLEV:
158 case StackFrame::TURBOFAN_JS:
159 case StackFrame::BUILTIN:
160 case StackFrame::WASM: {
163 const size_t frame_count = summaries.
size();
166 if (frame_count > *frame_index) {
167#if V8_ENABLE_DRUMBRAKE
168 if (frame_it->is_wasm() && !frame_it->is_wasm_interpreter_entry())
170 if (frame_it->is_wasm())
176 *frame_index -= frame_count;
182 case StackFrame::BUILTIN_EXIT:
193 Isolate* isolate, uint32_t frame_index) {
195 std::vector<FrameSummary> frames =
FindWasmFrame(&frame_it, &frame_index);
196 if (frames.empty()) {
200 int reversed_index =
static_cast<int>(frames.size() - 1 - frame_index);
201 const FrameSummary::WasmFrameSummary& summary =
202 frames[reversed_index].AsWasm();
203 return summary.wasm_instance();
208 uint32_t index, uint8_t* buffer,
209 uint32_t buffer_size, uint32_t* size) {
218 WasmInstanceObject::GetGlobalValue(instance, module->
globals[index]);
219 return GetWasmValue(wasm_value, buffer, buffer_size, size);
227 uint32_t index, uint8_t* buffer,
228 uint32_t buffer_size, uint32_t* size) {
232 std::vector<FrameSummary> frames =
FindWasmFrame(&frame_it, &frame_index);
233 if (frames.empty()) {
237 int reversed_index =
static_cast<int>(frames.size() - 1 - frame_index);
239 if (summary.IsWasm()) {
246 if (
static_cast<uint32_t
>(
251 return GetWasmValue(wasm_value, buffer, buffer_size, size);
260 uint32_t index, uint8_t* buffer,
261 uint32_t buffer_size, uint32_t* size) {
265 std::vector<FrameSummary> frames =
FindWasmFrame(&frame_it, &frame_index);
266 if (frames.empty()) {
270 int reversed_index =
static_cast<int>(frames.size() - 1 - frame_index);
272 if (summary.IsWasm()) {
279 if (
static_cast<uint32_t
>(
284 return GetWasmValue(wasm_value, buffer, buffer_size, size);
292 uint8_t* buffer, uint32_t size) {
295 uint32_t bytes_read = 0;
298 uint8_t* mem_start = instance->memory_start();
299 size_t mem_size = instance->memory_size();
300 if (
static_cast<uint64_t
>(
offset) + size <= mem_size) {
301 memcpy(buffer, mem_start +
offset, size);
303 }
else if (
offset < mem_size) {
304 bytes_read =
static_cast<uint32_t
>(mem_size) -
offset;
305 memcpy(buffer, mem_start +
offset, bytes_read);
312 uint8_t* buffer, uint32_t size) {
315 uint32_t bytes_read = 0;
322 uint32_t data_offset = EvalUint32InitExpr(instance, segment.
dest_addr);
325 uint8_t* mem_start = instance->memory_start();
326 size_t mem_size = instance->memory_size();
327 if (
static_cast<uint64_t
>(
offset) + size <= mem_size) {
328 memcpy(buffer, mem_start +
offset, size);
330 }
else if (
offset < mem_size) {
331 bytes_read =
static_cast<uint32_t
>(mem_size) -
offset;
332 memcpy(buffer, mem_start +
offset, bytes_read);
340 uint8_t* buffer, uint32_t size) {
341 uint32_t bytes_read = 0;
351 uint32_t module_size =
static_cast<uint32_t
>(wire_bytes.
length());
353 memcpy(buffer, wire_bytes.
start() +
offset, bytes_read);
363 int breakpoint_address =
static_cast<int>(
offset);
365 script,
condition, &breakpoint_address, breakpoint_id);
371 GetIsolate()->
debug()->RemoveBreakpointForWasmScript(script, breakpoint_id);
382bool StoreValue(
const T& value, uint8_t* buffer, uint32_t buffer_size,
384 *size =
sizeof(
value);
385 if (*size > buffer_size)
return false;
386 memcpy(buffer, &value, *size);
392 uint8_t* buffer, uint32_t buffer_size,
396 return StoreValue(wasm_value.to_i32(), buffer, buffer_size, size);
398 return StoreValue(wasm_value.to_i64(), buffer, buffer_size, size);
400 return StoreValue(wasm_value.to_f32(), buffer, buffer_size, size);
402 return StoreValue(wasm_value.to_f64(), buffer, buffer_size, size);
404 return StoreValue(wasm_value.to_s128(), buffer, buffer_size, size);
V8_INLINE Local< T > Get(Isolate *isolate) const
static v8::internal::Handle< To > OpenHandle(v8::Local< From > handle)
virtual FrameSummaries Summarize() const
static CommonFrame * cast(StackFrame *frame)
bool SetBreakPointForScript(Handle< Script > script, DirectHandle< String > condition, int *source_position, int *id)
CommonFrame * frame() const
Handle< Object > script() const
V8_INLINE bool is_null() const
v8::internal::Factory * factory()
Address callee_fp() const
virtual Type type() const =0
constexpr bool IsWeak() const
Tagged< HeapObject > GetHeapObjectAssumeWeak() const
WasmValue GetLocalValue(int local, Address pc, Address fp, Address debug_break_fp, Isolate *isolate)
WasmValue GetStackValue(int index, Address pc, Address fp, Address debug_break_fp, Isolate *isolate)
int GetStackDepth(Address pc, Isolate *isolate)
int GetNumLocals(Address pc, Isolate *isolate)
base::Vector< const uint8_t > wire_bytes() const
DebugInfo * GetDebugInfo()
constexpr ValueKind kind() const
CanonicalValueType type() const
static std::vector< wasm_addr_t > GetCallStack(uint32_t debug_context_id, Isolate *isolate)
Handle< WasmInstanceObject > GetFirstWasmInstance()
std::string GetModuleName() const
Global< debug::WasmScript > wasm_script_
static Handle< WasmInstanceObject > GetWasmInstance(Isolate *isolate, uint32_t frame_index)
static bool GetWasmStackValue(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
static std::vector< FrameSummary > FindWasmFrame(DebuggableStackFrameIterator *frame_it, uint32_t *frame_index)
void RemoveBreakpoint(uint32_t offset, int breakpoint_id)
static bool GetWasmLocal(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
uint32_t GetWasmMemory(Isolate *isolate, uint32_t offset, uint8_t *buffer, uint32_t size)
i::Isolate * GetIsolate() const
uint32_t GetWasmModuleBytes(wasm_addr_t wasm_addr, uint8_t *buffer, uint32_t size)
uint32_t GetWasmData(Isolate *isolate, uint32_t offset, uint8_t *buffer, uint32_t size)
static bool GetWasmValue(const wasm::WasmValue &wasm_value, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
WasmModuleDebug(v8::Isolate *isolate, Local< debug::WasmScript > script)
static bool GetWasmGlobal(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
bool AddBreakpoint(uint32_t offset, int *breakpoint_id)
void PrepareStep(Isolate *v8_isolate, StepAction action)
int GetLEB128Size(base::Vector< const uint8_t > module_bytes, int offset)
int ReturnPc(const NativeModule *native_module, int pc)
bool StoreValue(const T &value, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
int GetWasmFunctionOffset(const WasmModule *module, uint32_t func_index)
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
kInterpreterTrampolineOffset script
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
std::vector< FrameSummary > frames
const uint8_t * start() const
ConstantExpression dest_addr
std::vector< WasmGlobal > globals
std::vector< WasmDataSegment > data_segments