40#if V8_ENABLE_WEBASSEMBLY
47#if V8_ENABLE_DRUMBRAKE
60Address AddressOf(
const StackHandler* handler) {
61 Address raw = handler->address();
62#ifdef V8_USE_ADDRESS_SANITIZER
68 if (padding != 0)
return padding;
81#if V8_ENABLE_WEBASSEMBLY
82#if !V8_ENABLE_DRUMBRAKE && !USE_SIMULATOR
93 if (frame->is_c_wasm_entry()) {
95#if V8_ENABLE_DRUMBRAKE
97 }
else if (
v8_flags.wasm_jitless && frame->is_wasm_to_js()) {
123#if V8_ENABLE_DRUMBRAKE && USE_SIMULATOR
145#if V8_ENABLE_WEBASSEMBLY
149 first_stack_only_ =
true;
154 wasm::StackMemory* stack)
155 : StackFrameIteratorBase(isolate) {
156 first_stack_only_ =
true;
157 Reset(isolate->thread_local_top(), stack);
169#if V8_ENABLE_WEBASSEMBLY
170 if (
frame_->
type() == StackFrame::STACK_SWITCH &&
172 StackSwitchFrameConstants::kCallerFPOffset) ==
174 !first_stack_only_) {
180 wasm_stack_ = wasm_stack()->jmpbuf()->parent;
183 StackSwitchFrame::GetStateForJumpBuffer(wasm_stack_->jmpbuf(), &state);
196#
if V8_ENABLE_WEBASSEMBLY
201 while (!it.done()) it.Advance();
210#if V8_ENABLE_WEBASSEMBLY
238 state->pc_address =
reinterpret_cast<Address*
>(pc_address);
240 state->constant_pool_address =
nullptr;
241#if V8_ENABLE_WEBASSEMBLY
245 return StackFrame::WASM_TO_JS;
248 return StackFrame::WASM;
251 return StackFrame::TURBOFAN_JS;
259 const Address fast_c_call_caller_fp =
263 const Address caller_pc_address =
265 type = GetStateForFastCCallCallerFP(
isolate_, fast_c_call_caller_fp,
266 caller_pc, caller_pc_address, &state);
270#if V8_ENABLE_WEBASSEMBLY
277#if V8_ENABLE_WEBASSEMBLY
282 StackFrame::State
state;
283 StackSwitchFrame::GetStateForJumpBuffer(stack->jmpbuf(), &state);
299#define FRAME_TYPE_CASE(type, class) \
300 case StackFrame::type: \
301 frame_ = new (&class##_) class(this); \
304#undef FRAME_TYPE_CASE
310 case StackFrame::NUMBER_OF_TYPES:
350 : iterator_(isolate) {
369 std::vector<Tagged<SharedFunctionInfo>> infos;
371 return static_cast<int>(infos.size());
380 for (
int i = summaries.
size() - 1;
i >= 0;
i--) {
388#if V8_ENABLE_WEBASSEMBLY
389 if (is_wasm())
return summaries.
frames.back();
399 return function->shared()->IsSubjectToDebugging();
401#if V8_ENABLE_WEBASSEMBLY
402 if (
frame->is_wasm())
return true;
415 (builtin == Builtin::kInterpreterEntryTrampoline ||
416 builtin == Builtin::kInterpreterEnterAtBytecode ||
417 builtin == Builtin::kInterpreterEnterAtNextBytecode)) {
419 }
else if (isolate->interpreted_frames_native_stack()) {
420 intptr_t marker = Memory<intptr_t>(
431 }
else if (!isolate->heap()->InSpaceSlow(
pc,
CODE_SPACE)) {
438 isolate->heap()->FindCodeForInnerPointer(
pc);
439 return interpreter_entry_trampoline->is_interpreter_trampoline_builtin();
450 if (
pc < d.InstructionStartOfBytecodeHandlers() ||
451 pc >= d.InstructionEndOfBytecodeHandlers()) {
463 intptr_t marker = Memory<intptr_t>(frame_type_address);
477 high_bound_(js_entry_sp),
479 external_callback_scope_(isolate->external_callback_scope()),
480 top_link_register_(lr)
481#if V8_ENABLE_WEBASSEMBLY
483 wasm_stacks_(isolate->wasm_stacks())
486 if (!isolate->isolate_data()->stack_is_iterable()) {
496 static constexpr StackFrame::Type kTypeForAdvance = StackFrame::TURBOFAN_JS;
502 bool advance_frame =
true;
503 const Address fast_c_fp = isolate->isolate_data()->fast_c_call_caller_fp();
513 state.fp = fast_c_fp;
515 state.pc_address =
reinterpret_cast<Address*
>(
516 isolate->isolate_data()->fast_c_call_caller_pc_address());
529 advance_frame =
false;
533 type = kTypeForAdvance;
546 bool can_lookup_frame_type =
558 bool is_no_frame_bytecode_handler =
false;
560 Address* top_location =
nullptr;
565 top_location =
reinterpret_cast<Address*
>(sp);
568 std::optional<bool> is_interpreter_frame_pc =
569 IsInterpreterFramePc(isolate, *top_location, &state);
572 if (!is_interpreter_frame_pc.has_value()) {
573 can_lookup_frame_type =
false;
574 }
else if (is_interpreter_frame_pc.value()) {
575 state.pc_address = top_location;
576 is_no_frame_bytecode_handler =
true;
577 advance_frame =
false;
588 if (!can_lookup_frame_type) {
591 if (is_no_frame_bytecode_handler) {
592 type = StackFrame::INTERPRETED;
599 type = kTypeForAdvance;
608 if (advance_frame && !
done()) {
624 Address last_sp = last_frame->
sp(), last_fp = last_frame->
fp();
664 Address next_exit_frame_fp_address =
670 Address next_exit_frame_fp = Memory<Address>(next_exit_frame_fp_address);
702#if V8_ENABLE_WEBASSEMBLY
704 frame_->is_js_to_wasm()) {
715 if (last_callback_scope) {
738std::optional<Tagged<GcSafeCode>> GetContainingCode(
Isolate* isolate,
740 return isolate->inner_pointer_to_code_cache()->GetCacheEntry(
pc)->code;
752 std::optional<Tagged<GcSafeCode>>
result = GetContainingCode(
isolate(),
pc);
765 return {gc_safe_pair.first->UnsafeCastToCode(), gc_safe_pair.second};
771 DCHECK_GE(old_pc, holder->InstructionStart(isolate(), old_pc));
772 DCHECK_LT(old_pc, holder->InstructionEnd(isolate(), old_pc));
776 const uintptr_t pc_offset_from_start = old_pc - holder->instruction_start();
782 holder->raw_instruction_stream(code_cage_base);
786 if (visited_istream == old_istream) {
793 DCHECK(visited_holder->has_instruction_stream());
805 const Address new_pc = istream->instruction_start() + pc_offset_from_start;
822 if (code->is_interpreter_trampoline_builtin() ||
823 code->is_baseline_trampoline_builtin()) {
826 return StackFrame::INTERPRETED;
827 }
else if (code->is_baseline_leave_frame_builtin()) {
828 return StackFrame::BASELINE;
829 }
else if (code->is_turbofanned()) {
833 return StackFrame::TURBOFAN_JS;
835 return StackFrame::BUILTIN;
839 DCHECK_LE(
static_cast<uintptr_t
>(candidate), StackFrame::NUMBER_OF_TYPES);
841 case StackFrame::API_ACCESSOR_EXIT:
842 case StackFrame::API_CALLBACK_EXIT:
843 case StackFrame::BUILTIN_CONTINUATION:
844 case StackFrame::BUILTIN_EXIT:
845 case StackFrame::CONSTRUCT:
846 case StackFrame::FAST_CONSTRUCT:
847 case StackFrame::CONSTRUCT_ENTRY:
848 case StackFrame::ENTRY:
849 case StackFrame::EXIT:
850 case StackFrame::INTERNAL:
851 case StackFrame::IRREGEXP:
852 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION:
853 case StackFrame::JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH:
854 case StackFrame::STUB:
857#if V8_ENABLE_WEBASSEMBLY
858 case StackFrame::JS_TO_WASM:
859 case StackFrame::STACK_SWITCH:
860 case StackFrame::WASM:
861 case StackFrame::WASM_DEBUG_BREAK:
862 case StackFrame::WASM_EXIT:
863 case StackFrame::WASM_LIFTOFF_SETUP:
864 case StackFrame::WASM_TO_JS:
865 case StackFrame::WASM_SEGMENT_START:
866#if V8_ENABLE_DRUMBRAKE
867 case StackFrame::C_WASM_ENTRY:
868 case StackFrame::WASM_INTERPRETER_ENTRY:
880 case StackFrame::BASELINE:
881 case StackFrame::BUILTIN:
882 case StackFrame::INTERPRETED:
883 case StackFrame::MAGLEV:
885 case StackFrame::NATIVE:
887 case StackFrame::NUMBER_OF_TYPES:
888 case StackFrame::TURBOFAN_JS:
889 case StackFrame::TURBOFAN_STUB_WITH_CONTEXT:
890#if V8_ENABLE_WEBASSEMBLY
891#if !V8_ENABLE_DRUMBRAKE
892 case StackFrame::C_WASM_ENTRY:
894 case StackFrame::WASM_TO_JS_FUNCTION:
896 return StackFrame::NATIVE;
905#if V8_ENABLE_WEBASSEMBLY
914#if V8_ENABLE_WEBASSEMBLY
919 switch (wasm_code->kind()) {
921 return StackFrame::WASM;
923 return StackFrame::WASM_EXIT;
925 return StackFrame::WASM_TO_JS;
926#if V8_ENABLE_DRUMBRAKE
927 case wasm::WasmCode::kInterpreterEntry:
928 return StackFrame::WASM_INTERPRETER_ENTRY;
937 std::optional<Tagged<GcSafeCode>> lookup_result =
939 if (!lookup_result.has_value())
return StackFrame::NATIVE;
944 const intptr_t marker = Memory<intptr_t>(
946 switch (lookup_result.value()->kind()) {
947 case CodeKind::BUILTIN: {
949 return ComputeBuiltinFrameType(lookup_result.value());
951 case CodeKind::BASELINE:
953 if (lookup_result.value()->marked_for_deoptimization())
954 return StackFrame::INTERPRETED;
955 return StackFrame::BASELINE;
956 case CodeKind::MAGLEV:
963 return StackFrame::INTERNAL;
965 return StackFrame::MAGLEV;
966 case CodeKind::TURBOFAN_JS:
967 return StackFrame::TURBOFAN_JS;
968#if V8_ENABLE_WEBASSEMBLY
969 case CodeKind::JS_TO_WASM_FUNCTION:
970 if (lookup_result.value()->builtin_id() == Builtin::kJSToWasmWrapperAsm) {
971 return StackFrame::JS_TO_WASM;
973#if V8_ENABLE_DRUMBRAKE
974 if (lookup_result.value()->builtin_id() ==
975 Builtin::kGenericJSToWasmInterpreterWrapper) {
976 return StackFrame::JS_TO_WASM;
979 return StackFrame::TURBOFAN_STUB_WITH_CONTEXT;
980 case CodeKind::C_WASM_ENTRY:
981 return StackFrame::C_WASM_ENTRY;
982 case CodeKind::WASM_TO_JS_FUNCTION:
983 return StackFrame::WASM_TO_JS_FUNCTION;
984 case CodeKind::WASM_FUNCTION:
985 case CodeKind::WASM_TO_CAPI_FUNCTION:
989 case CodeKind::C_WASM_ENTRY:
990 case CodeKind::JS_TO_WASM_FUNCTION:
991 case CodeKind::WASM_FUNCTION:
992 case CodeKind::WASM_TO_CAPI_FUNCTION:
993 case CodeKind::WASM_TO_JS_FUNCTION:
996 case CodeKind::BYTECODE_HANDLER:
997 case CodeKind::FOR_TESTING:
998 case CodeKind::REGEXP:
999 case CodeKind::INTERPRETED_FUNCTION:
1009#if V8_ENABLE_WEBASSEMBLY
1019#if V8_ENABLE_WEBASSEMBLY
1023 return StackFrame::WASM_TO_JS;
1030 const intptr_t marker = Memory<intptr_t>(
1040 if (
IsSmi(maybe_function)) {
1041 return StackFrame::NATIVE;
1044 std::optional<bool> is_interpreter_frame =
1045 IsInterpreterFramePc(
isolate(),
pc, state);
1049 if (!is_interpreter_frame.has_value()) {
1053 if (is_interpreter_frame.value()) {
1054 return StackFrame::INTERPRETED;
1057 return StackFrame::TURBOFAN_JS;
1062 return iterator_->ComputeStackFrameType(state);
1075 state->constant_pool_address =
nullptr;
1087 const Address fast_c_call_caller_fp =
1093 return GetStateForFastCCallCallerFP(
isolate(), fast_c_call_caller_fp,
1101#if V8_ENABLE_WEBASSEMBLY
1103 const int offset = CWasmEntryFrameConstants::kCEntryFPOffset;
1108#if V8_ENABLE_DRUMBRAKE
1109void CWasmEntryFrame::Iterate(RootVisitor* v)
const {
1130 state->constant_pool_address =
reinterpret_cast<Address*
>(
1144#if V8_ENABLE_WEBASSEMBLY
1145 Address sp = type == WASM_EXIT ? WasmExitFrame::ComputeStackPointer(
fp)
1161 if (!
IsSmi(marker)) {
1168 switch (frame_type) {
1170 case API_ACCESSOR_EXIT:
1171 case API_CALLBACK_EXIT:
1172#if V8_ENABLE_WEBASSEMBLY
1188#if V8_ENABLE_WEBASSEMBLY
1192 Address sp = fp + WasmExitFrameConstants::kWasmInstanceDataOffset;
1194 fp + WasmExitFrameConstants::kCallingPCOffset);
1209 state->constant_pool_address =
nullptr;
1216 int code_offset = -1;
1257 for (
int i = 0;
i < param_count;
i++) {
1269namespace ensure_layout {
1282 if (IsJSFunction(maybe_function)) {
1285 DCHECK(IsFunctionTemplateInfo(maybe_function));
1296 function_template_info)
1306 if (IsJSFunction(maybe_function)) {
1309 DCHECK(shared_info->IsApiFunction());
1310 return direct_handle(shared_info->api_func_data(), isolate());
1312 DCHECK(IsFunctionTemplateInfo(maybe_function));
1322 for (
int i = 0;
i < param_count;
i++) {
1333 int code_offset = -1;
1373#define CASE(value, name) \
1374 case StackFrame::value: \
1379 return "NoFrameType";
1389 PrintIndex(accumulator, mode, index);
1390 accumulator->
Add(StringForStackFrameType(
type()));
1391 accumulator->
Add(
" [pc: %p]\n",
1403 PrintIndex(accumulator, mode, index);
1404 accumulator->
Add(
"BuiltinExitFrame ");
1405 if (sfi->HasBuiltinId()) {
1417 for (
int i = 0;
i < parameters_count;
i++) {
1421 accumulator->
Add(
")\n");
1431 PrintIndex(accumulator, mode, index);
1432 accumulator->
Add(
"ApiCallbackExitFrame ");
1440 for (
int i = 0;
i < parameters_count;
i++) {
1444 accumulator->
Add(
")\n\n");
1451 PrintIndex(accumulator, mode, index);
1452 accumulator->
Add(
"api accessor exit frame: ");
1476 int code_offset = -1;
1478 return code->SourcePosition(code_offset);
1491#if V8_ENABLE_WEBASSEMBLY
1502 state->callee_fp =
fp();
1504 state->constant_pool_address =
reinterpret_cast<Address*
>(
1516#ifdef V8_COMPRESS_POINTERS
1518 bool was_compressed =
false;
1545 was_compressed =
true;
1547 cage_base,
static_cast<Tagged_t>(value));
1556 bool is_self_forwarded =
1558 if (is_self_forwarded) {
1567 MapWord fwd_map_map_word =
1569 if (fwd_map_map_word.IsForwardingAddress()) {
1570 forwarded_map = fwd_map_map_word.ToForwardingAddress(forwarded_map);
1572 CHECK(IsMap(forwarded_map, cage_base));
1580 was_compressed = slot_contents <= 0xFFFFFFFF;
1583 cage_base, compressed_value);
1588#if V8_COMPRESS_POINTERS
1589 if (was_compressed) {
1598void VisitSpillSlots(Isolate* isolate, RootVisitor* v,
1599 FullObjectSlot first_slot_offset,
1601 FullObjectSlot slot_offset = first_slot_offset;
1605 bits &= ~(1 << bit);
1606 FullObjectSlot spill_slot = slot_offset + bit;
1607 VisitSpillSlot(isolate, v, spill_slot);
1613SafepointEntry GetSafepointEntryFromCodeCache(
1614 Isolate* isolate,
Address inner_pointer,
1615 InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* entry) {
1616 if (!entry->safepoint_entry.is_initialized()) {
1617 entry->safepoint_entry =
1619 DCHECK(entry->safepoint_entry.is_initialized());
1622 entry->safepoint_entry,
1625 return entry->safepoint_entry;
1628MaglevSafepointEntry GetMaglevSafepointEntryFromCodeCache(
1629 Isolate* isolate,
Address inner_pointer,
1630 InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* entry) {
1631 if (!entry->maglev_safepoint_entry.is_initialized()) {
1633 isolate, entry->code.value(), inner_pointer);
1634 DCHECK(entry->maglev_safepoint_entry.is_initialized());
1636 DCHECK_EQ(entry->maglev_safepoint_entry,
1640 return entry->maglev_safepoint_entry;
1645#ifdef V8_ENABLE_WEBASSEMBLY
1646#if V8_ENABLE_DRUMBRAKE
1652class DrumBrakeWasmCode {
1654 explicit DrumBrakeWasmCode(wasm::WasmCode* wasm_code)
1655 : wasm_code_(wasm_code) {}
1657 static std::unique_ptr<DrumBrakeWasmCode> Interpreted() {
1658 return std::make_unique<DrumBrakeWasmCode>(
nullptr);
1660 static std::unique_ptr<DrumBrakeWasmCode> Compiled(
1661 wasm::WasmCode* wasm_code) {
1662 return std::make_unique<DrumBrakeWasmCode>(wasm_code);
1665 bool is_liftoff()
const {
1666 return wasm_code_ ? wasm_code_->is_liftoff() :
false;
1668 bool frame_has_feedback_slot()
const {
1669 return wasm_code_ ? wasm_code_->frame_has_feedback_slot() :
false;
1671 int stack_slots()
const {
return wasm_code_ ? wasm_code_->stack_slots() : 0; }
1672 wasm::WasmCode::Kind
kind()
const {
1673 return wasm_code_ ? wasm_code_->kind() : wasm::WasmCode::kInterpreterEntry;
1675 uint16_t first_tagged_parameter_slot()
const {
1676 return wasm_code_ ? wasm_code_->first_tagged_parameter_slot() : 0;
1678 uint16_t num_tagged_parameter_slots()
const {
1679 return wasm_code_ ? wasm_code_->num_tagged_parameter_slots() : 0;
1683 const wasm::WasmCode* wasm_code_;
1687void WasmFrame::Iterate(RootVisitor* v)
const {
1688 DCHECK(!iterator_->IsStackFrameIteratorForProfiler());
1719#if !V8_ENABLE_DRUMBRAKE
1721 isolate(), maybe_unauthenticated_pc());
1722 wasm::WasmCode* wasm_code = pair.first;
1723 SafepointEntry safepoint_entry = pair.second;
1725 std::unique_ptr<DrumBrakeWasmCode> interpreter_wasm_code;
1726 SafepointEntry safepoint_entry;
1727 bool is_wasm_interpreter_frame =
1729 (
type() == WASM_INTERPRETER_ENTRY ||
type() == C_WASM_ENTRY);
1730 if (is_wasm_interpreter_frame) {
1731 interpreter_wasm_code = DrumBrakeWasmCode::Interpreted();
1735 wasm::WasmCode* wasm_code = pair.first;
1736 safepoint_entry = pair.second;
1738 interpreter_wasm_code = DrumBrakeWasmCode::Compiled(wasm_code);
1743 DrumBrakeWasmCode* wasm_code = interpreter_wasm_code.get();
1751 DCHECK(type == WASM_TO_JS || type == WASM || type == WASM_EXIT ||
1752 type == WASM_SEGMENT_START);
1758 static_assert(WasmExitFrameConstants::kFixedSlotCountFromFp ==
1759 WasmFrameConstants::kFixedSlotCountFromFp + 1,
1760 "WasmExitFrame has one slot more than WasmFrame");
1762 int frame_header_size = WasmFrameConstants::kFixedFrameSizeFromFp;
1763 if (wasm_code->is_liftoff() && wasm_code->frame_has_feedback_slot()) {
1767 int spill_slot_space =
1771 FullObjectSlot frame_header_base(&Memory<Address>(fp() - frame_header_size));
1772 FullObjectSlot frame_header_limit(
1806 wasm::StackMemory::StackSwitchInfo maybe_stack_switch;
1807 if (iterator_->wasm_stack() !=
nullptr) {
1808 maybe_stack_switch = iterator_->wasm_stack()->stack_switch_info();
1810 FullObjectSlot parameters_limit(
1811 maybe_stack_switch.has_value() && maybe_stack_switch.source_fp == fp()
1812 ? maybe_stack_switch.target_sp
1813 : frame_header_base.address() - spill_slot_space);
1814 FullObjectSlot spill_space_end =
1815 FullObjectSlot(frame_header_base.address() - spill_slot_space);
1818 bool has_tagged_outgoing_params =
1821 if (!InFastCCall() && has_tagged_outgoing_params) {
1822 FullObjectSlot parameters_base(&Memory<Address>(
sp()));
1823 v->VisitRootPointers(Root::kStackRoots,
nullptr, parameters_base,
1828 if (safepoint_entry.is_initialized()) {
1830 safepoint_entry.tagged_slots().size());
1831 VisitSpillSlots(
isolate(), v, spill_space_end,
1832 safepoint_entry.tagged_slots());
1839 if (wasm_code->num_tagged_parameter_slots() > 0) {
1840 FullObjectSlot tagged_parameter_base(&Memory<Address>(caller_sp()));
1841 tagged_parameter_base += wasm_code->first_tagged_parameter_slot();
1842 FullObjectSlot tagged_parameter_limit =
1843 tagged_parameter_base + wasm_code->num_tagged_parameter_slots();
1845 v->VisitRootPointers(Root::kStackRoots,
nullptr, tagged_parameter_base,
1846 tagged_parameter_limit);
1850 v->VisitRootPointers(Root::kStackRoots,
nullptr, frame_header_base,
1851 frame_header_limit);
1856 Memory<Address>(
fp() + WasmToJSWrapperConstants::kSignatureOffset);
1857 if (maybe_sig == 0 || maybe_sig ==
static_cast<Address>(-1)) {
1863 const wasm::CanonicalSig*
sig =
1864 reinterpret_cast<wasm::CanonicalSig*
>(maybe_sig);
1876 bool has_tagged_param =
false;
1877 for (wasm::CanonicalValueType type :
sig->parameters()) {
1881 has_tagged_param =
true;
1885 allocator.Next(param);
1894 allocator.EndSlotArea();
1896 if (!has_tagged_param)
return;
1898#if V8_TARGET_ARCH_ARM64
1899 constexpr size_t size_of_sig = 2;
1901 constexpr size_t size_of_sig = 1;
1904 for (wasm::CanonicalValueType type :
sig->parameters()) {
1908 LinkageLocation l = allocator.Next(param);
1909 if (l.IsRegister()) {
1911 int slot_offset = 0;
1917 slot_offset =
static_cast<int>(
i) - 1;
1922 size_t param_start_offset = 2 + size_of_sig;
1923 FullObjectSlot param_start(
fp() +
1925 FullObjectSlot tagged_slot = param_start + slot_offset;
1926 VisitSpillSlot(
isolate(), v, tagged_slot);
1931 int slot_offset = -l.GetLocation() - 1;
1935 size_t param_start_offset =
1948 param_start_offset++;
1950 FullObjectSlot param_start(
fp() +
1952 FullObjectSlot tagged_slot = param_start + slot_offset;
1953 VisitSpillSlot(
isolate(), v, tagged_slot);
1960 if (code->wasm_js_tagged_parameter_count() > 0) {
1961 FullObjectSlot tagged_parameter_base(&Memory<Address>(
caller_sp()));
1962 tagged_parameter_base += code->wasm_js_first_tagged_parameter();
1963 FullObjectSlot tagged_parameter_limit =
1964 tagged_parameter_base + code->wasm_js_tagged_parameter_count();
1965 v->VisitRootPointers(Root::kStackRoots,
nullptr, tagged_parameter_base,
1966 tagged_parameter_limit);
1999#if V8_ENABLE_WEBASSEMBLY
2000 bool is_generic_wasm_to_js =
2001 code->is_builtin() && code->builtin_id() == Builtin::kWasmToJsWrapperCSA;
2002 bool is_optimized_wasm_to_js = this->
type() == WASM_TO_JS_FUNCTION;
2003 if (is_generic_wasm_to_js) {
2005 }
else if (is_optimized_wasm_to_js) {
2009 DCHECK(code->is_turbofanned());
2011 GetSafepointEntryFromCodeCache(
isolate(), inner_pointer, entry);
2021 int spill_slots_size =
2026 FullObjectSlot frame_header_base(&Memory<Address>(
fp() - frame_header_size));
2030#if V8_ENABLE_WEBASSEMBLY
2062 if (
iterator_->wasm_stack() !=
nullptr) {
2063 maybe_stack_switch =
iterator_->wasm_stack()->stack_switch_info();
2068 : frame_header_base.address() - spill_slots_size);
2086 VisitSpillSlots(
isolate(), v, spill_slots_end,
2091 frame_header_limit);
2141 DCHECK(code->is_maglevved());
2143 GetMaglevSafepointEntryFromCodeCache(
isolate(), inner_pointer, entry);
2160 uint32_t spill_slot_count =
2164 DCHECK(code->has_tagged_outgoing_params());
2167 frame_header_base - spill_slot_count -
2178 frame_header_base - spill_slot_count - 1;
2179 uint32_t tagged_register_indexes =
2181 while (tagged_register_indexes != 0) {
2183 tagged_register_indexes &= ~(1 <<
index);
2185 VisitSpillSlot(
isolate(), v, spill_slot);
2190 for (uint32_t
i = 0;
i < tagged_slot_count; ++
i) {
2192 VisitSpillSlot(
isolate(), v, spill_slot);
2198 frame_header_limit);
2214 CHECK(data.is_null());
2216 "Missing deoptimization information for OptimizedJSFrame::Summarize.");
2220 data->FrameTranslation(), data->TranslationIndex(deopt_index).value());
2223 int js_frames = it.EnterBeginOpcode().js_frame_count;
2226 while (js_frames > 0) {
2242#if V8_ENABLE_WEBASSEMBLY
2251 if (wasm_callee)
return false;
2255 if (
callee_pc() >= wrapper->instruction_start() &&
2256 callee_pc() <= wrapper->instruction_end()) {
2259 return code_lookup->has_tagged_outgoing_params();
2261 return code_lookup->has_tagged_outgoing_params();
2266 std::optional<Tagged<GcSafeCode>> code_lookup =
2268 if (!code_lookup.has_value())
return {};
2269 return code_lookup.value();
2304 DCHECK(code->is_turbofanned());
2306 GetSafepointEntryFromCodeCache(
isolate(), inner_pointer, entry);
2317 int spill_slot_count =
2321 FullObjectSlot frame_header_base(&Memory<Address>(
fp() - frame_header_size));
2325 FullObjectSlot parameters_limit = frame_header_base - spill_slot_count;
2344 VisitSpillSlots(
isolate(), v, parameters_limit,
2350 frame_header_limit);
2365 std::optional<Tagged<GcSafeCode>> code_lookup =
2367 if (!code_lookup.has_value())
return {};
2368 return code_lookup.value();
2375 DCHECK(code->is_turbofanned());
2376 DCHECK(code->has_handler_table());
2383#if V8_ENABLE_WEBASSEMBLY
2385 if (code->kind() != CodeKind::BUILTIN)
return summaries;
2389 switch (code->builtin_id()) {
2390 case Builtin::kThrowDataViewTypeError:
2391 case Builtin::kThrowDataViewDetachedError:
2392 case Builtin::kThrowDataViewOutOfBounds:
2393 case Builtin::kThrowIndexOfCalledOnNull:
2394 case Builtin::kThrowToLowerCaseCalledOnNull:
2395 case Builtin::kWasmIntToString: {
2399 FrameSummary::BuiltinFrameSummary summary(
isolate(), code->builtin_id());
2400 summaries.
frames.push_back(summary);
2424 return static_cast<int>(
2438 DCHECK(functions->empty());
2444 DCHECK(functions->empty());
2445 std::vector<Tagged<SharedFunctionInfo>> raw_functions;
2447 for (
const auto& raw_function : raw_functions) {
2448 functions->push_back(
2455 int code_offset = 0;
2472 return {abstract_code, code_offset};
2514 return maybe_result;
2525 CHECK(!code_lookup_result->has_handler_table());
2526 CHECK(!code_lookup_result->is_optimized_code() ||
2527 code_lookup_result->kind() == CodeKind::BASELINE);
2535 int code_offset, FILE* file,
2536 bool print_line_number) {
2539 function->PrintName(file);
2540 PrintF(file,
"+%d", code_offset);
2541 if (print_line_number) {
2543 int source_pos = code->SourcePosition(isolate, code_offset);
2545 if (IsScript(maybe_script)) {
2547 int line = script->GetLineNumber(source_pos) + 1;
2549 if (IsString(script_name_raw)) {
2551 std::unique_ptr<char[]> c_script_name = script_name->ToCString();
2552 PrintF(file,
" at %s:%d", c_script_name.get(), line);
2554 PrintF(file,
" at <unknown>:%d", line);
2557 PrintF(file,
" at <unknown>:<unknown>");
2563 bool print_line_number) {
2567 while (!it.done()) {
2568 if (it.frame()->is_javascript()) {
2572 int code_offset = 0;
2601 ICInfo& ic_info = ic_stats->Current();
2605 ic_info.
function_name = ic_stats->GetOrCacheFunctionName(isolate, function);
2608 int source_pos = code->SourcePosition(isolate, code_offset);
2610 if (IsScript(maybe_script, cage_base)) {
2613 script->GetPositionInfo(source_pos, &info);
2616 ic_info.
script_name = ic_stats->GetOrCacheScriptName(script);
2626 isolate()->
heap()->gc_state() == Heap::NOT_IN_GC);
2629 ->internal_formal_parameter_count_without_receiver();
2633 return static_cast<int>(
2645 for (
int i = 0;
i < param_count;
i++) {
2682 Address exception_argument_slot =
2689 Memory<Address>(exception_argument_slot) = exception.ptr();
2699 abstract_code_(abstract_code, isolate),
2700 code_offset_(code_offset),
2706 (
v8_flags.maglev_inline_api_calls &&
2708 function->shared()->IsApiFunction()));
2712 if (IsJavaScript()) {
2713 javascript_summary_.EnsureSourcePositionsAvailable();
2718 if (IsJavaScript()) {
2719 return javascript_summary_.AreSourcePositionsAvailable();
2730 return !
v8_flags.enable_lazy_source_positions ||
2734 ->HasSourcePositionTable();
2738 return function()->shared()->IsSubjectToDebugging();
2763 if (function_name->length() == 0 &&
2765 function_name =
isolate()->factory()->eval_string();
2775 int source_position =
2776 abstract_code()->SourcePosition(
isolate(), bytecode_offset);
2777 return isolate()->factory()->NewStackFrameInfo(
2780 return isolate()->factory()->NewStackFrameInfo(
2784#if V8_ENABLE_WEBASSEMBLY
2785FrameSummary::WasmFrameSummary::WasmFrameSummary(
2788 bool at_to_number_conversion)
2791 at_to_number_conversion_(at_to_number_conversion),
2793 byte_offset_(byte_offset),
2794 function_index_(function_index) {}
2797 return isolate()->global_proxy();
2800uint32_t FrameSummary::WasmFrameSummary::function_index()
const {
2801 return function_index_;
2804int FrameSummary::WasmFrameSummary::SourcePosition()
const {
2805 const wasm::WasmModule* module = wasm_trusted_instance_data()->module();
2806 return GetSourcePosition(module, function_index(),
code_offset(),
2807 at_to_number_conversion());
2814DirectHandle<WasmInstanceObject> FrameSummary::WasmFrameSummary::wasm_instance()
2817 CHECK(instance_data_->has_instance_object());
2818 return direct_handle(instance_data_->instance_object(), isolate());
2821DirectHandle<Context> FrameSummary::WasmFrameSummary::native_context()
const {
2826DirectHandle<StackFrameInfo>
2827FrameSummary::WasmFrameSummary::CreateStackFrameInfo()
const {
2828 DirectHandle<String> function_name =
2831 function_name,
false);
2834FrameSummary::WasmInlinedFrameSummary::WasmInlinedFrameSummary(
2836 int function_index,
int op_wire_bytes_offset)
2837 : FrameSummaryBase(isolate, WASM_INLINED),
2839 function_index_(function_index),
2840 op_wire_bytes_offset_(op_wire_bytes_offset) {}
2842DirectHandle<WasmInstanceObject>
2843FrameSummary::WasmInlinedFrameSummary::wasm_instance()
const {
2845 CHECK(instance_data_->has_instance_object());
2846 return direct_handle(instance_data_->instance_object(), isolate());
2849Handle<Object> FrameSummary::WasmInlinedFrameSummary::receiver()
const {
2850 return isolate()->global_proxy();
2853uint32_t FrameSummary::WasmInlinedFrameSummary::function_index()
const {
2854 return function_index_;
2857int FrameSummary::WasmInlinedFrameSummary::SourcePosition()
const {
2858 const wasm::WasmModule* module = instance_data_->module();
2862Handle<Script> FrameSummary::WasmInlinedFrameSummary::script()
const {
2866DirectHandle<Context> FrameSummary::WasmInlinedFrameSummary::native_context()
2872DirectHandle<StackFrameInfo>
2873FrameSummary::WasmInlinedFrameSummary::CreateStackFrameInfo()
const {
2874 DirectHandle<String> function_name =
2877 function_name,
false);
2880#if V8_ENABLE_DRUMBRAKE
2881FrameSummary::WasmInterpretedFrameSummary::WasmInterpretedFrameSummary(
2883 uint32_t function_index,
int byte_offset)
2884 : FrameSummaryBase(isolate, WASM_INTERPRETED),
2885 wasm_instance_(instance),
2886 function_index_(function_index),
2887 byte_offset_(byte_offset) {}
2889Handle<Object> FrameSummary::WasmInterpretedFrameSummary::receiver()
const {
2890 return wasm_instance_->GetIsolate()->global_proxy();
2893int FrameSummary::WasmInterpretedFrameSummary::SourcePosition()
const {
2894 const wasm::WasmModule* module = wasm_instance()->module_object()->module();
2900FrameSummary::WasmInterpretedFrameSummary::instance_data()
const {
2901 return handle(wasm_instance_->trusted_data(isolate()),
isolate());
2904Handle<Script> FrameSummary::WasmInterpretedFrameSummary::script()
const {
2905 return handle(wasm_instance()->module_object()->
script(),
2906 wasm_instance()->GetIsolate());
2909DirectHandle<Context>
2910FrameSummary::WasmInterpretedFrameSummary::native_context()
const {
2915DirectHandle<StackFrameInfo>
2916FrameSummary::WasmInterpretedFrameSummary::CreateStackFrameInfo()
const {
2917 DirectHandle<String> function_name =
2920 function_name,
false);
2924FrameSummary::BuiltinFrameSummary::BuiltinFrameSummary(Isolate* isolate,
2926 : FrameSummaryBase(isolate, FrameSummary::
BUILTIN), builtin_(builtin) {}
2928Handle<Object> FrameSummary::BuiltinFrameSummary::receiver()
const {
2929 return isolate()->factory()->undefined_value();
2932Handle<Object> FrameSummary::BuiltinFrameSummary::script()
const {
2933 return isolate()->factory()->undefined_value();
2936DirectHandle<Context> FrameSummary::BuiltinFrameSummary::native_context()
2938 return isolate()->native_context();
2941DirectHandle<StackFrameInfo>
2942FrameSummary::BuiltinFrameSummary::CreateStackFrameInfo()
const {
2943 DirectHandle<String> name_str =
2944 isolate()->factory()->NewStringFromAsciiChecked(
2946 return isolate()->factory()->NewStackFrameInfo(
2953#define FRAME_SUMMARY_DESTR(kind, type, field, desc) \
2962#undef FRAME_SUMMARY_DESTR
2968 return summaries.
frames.back();
2972 return Get(frame, 0);
2978 return summaries.
frames.front();
2988#if V8_ENABLE_WEBASSEMBLY
2989#ifdef V8_ENABLE_DRUMBRAKE
2990#define CASE_WASM_INTERPRETED(name) \
2991 case WASM_INTERPRETED: \
2992 return wasm_interpreted_summary_.name();
2994#define CASE_WASM_INTERPRETED(name)
2996#define FRAME_SUMMARY_DISPATCH(ret, name) \
2997 ret FrameSummary::name() const { \
2998 switch (base_.kind()) { \
3000 return javascript_summary_.name(); \
3002 return wasm_summary_.name(); \
3003 case WASM_INLINED: \
3004 return wasm_inlined_summary_.name(); \
3006 return builtin_summary_.name(); \
3007 CASE_WASM_INTERPRETED(name) \
3013#define FRAME_SUMMARY_DISPATCH(ret, name) \
3014 ret FrameSummary::name() const { \
3015 DCHECK_EQ(JAVASCRIPT, base_.kind()); \
3016 return javascript_summary_.name(); \
3030#undef CASE_WASM_INTERPRETED
3031#undef FRAME_SUMMARY_DISPATCH
3040 if (code->kind() == CodeKind::BUILTIN) {
3046 GetDeoptimizationData(*code, &deopt_index);
3055 if (code->is_maglevved()) {
3063 summaries.
frames.push_back(summary);
3067 CHECK(data.is_null());
3069 "Missing deoptimization information for OptimizedJSFrame::Summarize.");
3080 for (
auto it = translated.
begin(); it != translated.
end(); it++) {
3092 CHECK(!translated_values->IsMaterializedObject());
3095 translated_values++;
3098 CHECK(!translated_values->IsMaterializedObject());
3100 translated_values++;
3124 summaries.
frames.push_back(summary);
3131#if V8_ENABLE_WEBASSEMBLY
3132 }
else if (it->kind() == TranslatedFrame::kWasmInlinedIntoJS) {
3137 shared_info->wasm_exported_function_data();
3140 int func_index = function_data->function_index();
3141 FrameSummary::WasmInlinedFrameSummary summary(
3142 isolate(), instance, func_index, it->bytecode_offset().ToInt());
3143 summaries.
frames.push_back(summary);
3164 std::tie(code,
pc_offset) = LookupCodeAndOffset();
3167 if (table.NumberOfReturnEntries() == 0)
return -1;
3175 if (!code->marked_for_deoptimization()) {
3179 int optimized_exception_handler = table.LookupReturn(
pc_offset);
3181 return optimized_exception_handler;
3184 function(), LazyDeoptimizeReason::kExceptionCaught, code);
3186 DCHECK(code->marked_for_deoptimization());
3193 int trampoline_pc)
const {
3194 DCHECK_EQ(code->kind(), CodeKind::MAGLEV);
3195 DCHECK(code->marked_for_deoptimization());
3201 int trampoline_pc)
const {
3202 DCHECK_EQ(code->kind(), CodeKind::TURBOFAN_JS);
3203 DCHECK(code->marked_for_deoptimization());
3212 Address pc = maybe_unauthenticated_pc();
3214 DCHECK(code->contains(isolate(),
pc));
3217 if (code->is_maglevved()) {
3219 code->GetMaglevSafepointEntry(
isolate(),
pc);
3237 DCHECK(functions->empty());
3243 if (code->kind() == CodeKind::BUILTIN) {
3250 GetDeoptimizationData(code, &deopt_index);
3256 data->FrameTranslation(), data->TranslationIndex(deopt_index).value());
3257 int jsframe_count = it.EnterBeginOpcode().js_frame_count;
3261 while (jsframe_count != 0) {
3289 int handler_index = table.LookupHandlerIndexForRange(GetBytecodeOffset());
3291 if (context_register) *context_register = table.GetRangeData(handler_index);
3292 if (prediction) *prediction = table.GetRangePrediction(handler_index);
3293 table.MarkHandlerUsed(handler_index);
3294 return table.GetRangeHandler(handler_index);
3296 return handler_index;
3308 int register_index)
const {
3313 return GetExpression(index + register_index);
3321 isolate(),
receiver(), function(), *abstract_code, GetBytecodeOffset(),
3322 IsConstructor(), *params);
3331 int raw_offset =
Smi::ToInt(GetExpression(index));
3350 SetExpression(index, bytecode_array);
3355 return code->GetBytecodeOffsetForBaselinePC(this->
pc(), GetBytecodeArray());
3360 return code->GetBaselineStartPCForBytecodeOffset(bytecode_offset,
3361 GetBytecodeArray());
3380#if V8_ENABLE_WEBASSEMBLY
3381void WasmFrame::Print(
StringStream* accumulator, PrintMode mode,
3383 PrintIndex(accumulator, mode, index);
3385#if V8_ENABLE_DRUMBRAKE
3388 accumulator->
Add(
"Wasm-to-JS");
3389 if (mode != OVERVIEW) accumulator->
Add(
"\n");
3395 accumulator->
Add(
"Anonymous wasm wrapper [pc: %p]\n",
3396 reinterpret_cast<void*
>(
pc()));
3399 wasm::WasmCodeRefScope code_ref_scope;
3400 accumulator->
Add(is_wasm_to_js() ?
"Wasm-to-JS [" :
"Wasm [");
3402 Address instruction_start = wasm_code()->instruction_start();
3403 base::Vector<const uint8_t> raw_func_name =
3404 module_object()->GetRawFunctionName(function_index());
3405 const int kMaxPrintedFunctionName = 64;
3406 char func_name[kMaxPrintedFunctionName + 1];
3407 int func_name_len = std::min(kMaxPrintedFunctionName, raw_func_name.length());
3408 memcpy(func_name, raw_func_name.begin(), func_name_len);
3409 func_name[func_name_len] =
'\0';
3411 const wasm::WasmModule* module = trusted_instance_data()->module();
3412 int func_index = function_index();
3413 int func_code_offset =
module->functions[func_index].code.offset();
3415 "], function #%u ('%s'), pc=%p (+0x%x), pos=%d (+%d) instance=%p\n",
3416 func_index, func_name,
reinterpret_cast<void*
>(
pc()),
3417 static_cast<int>(
pc() - instruction_start),
pos,
pos - func_code_offset,
3418 reinterpret_cast<void*
>(trusted_instance_data()->ptr()));
3419 if (mode != OVERVIEW) accumulator->
Add(
"\n");
3422wasm::WasmCode* WasmFrame::wasm_code()
const {
3424 maybe_unauthenticated_pc());
3429 CHECK(trusted_instance_data()->has_instance_object());
3430 return trusted_instance_data()->instance_object();
3435 Memory<Address>(fp() + WasmFrameConstants::kWasmInstanceDataOffset));
3439wasm::NativeModule* WasmFrame::native_module()
const {
3440 return trusted_instance_data()->native_module();
3444 return trusted_instance_data()->module_object();
3447int WasmFrame::function_index()
const {
return wasm_code()->index(); }
3449Tagged<Script> WasmFrame::script()
const {
return module_object()->script(); }
3451int WasmFrame::position()
const {
3452 const wasm::WasmModule* module = trusted_instance_data()->module();
3454 at_to_number_conversion());
3457int WasmFrame::generated_code_offset()
const {
3458 wasm::WasmCode* code = wasm_code();
3459 int offset =
static_cast<int>(
pc() - code->instruction_start());
3460 return code->GetSourceOffsetBefore(
offset);
3463bool WasmFrame::is_inspectable()
const {
return wasm_code()->is_inspectable(); }
3466 return trusted_instance_data()->native_context();
3469FrameSummaries WasmFrame::Summarize()
const {
3470 FrameSummaries summaries;
3473 wasm::WasmCode* code = wasm_code();
3475 static_cast<int>(maybe_unauthenticated_pc() - code->instruction_start());
3480 bool at_conversion = at_to_number_conversion();
3481 bool child_was_tail_call =
false;
3483 while (
pos.isInlined()) {
3488 const auto [func_index, was_tail_call, caller_pos] =
3489 code->GetInliningPosition(
pos.InliningId());
3490 if (!child_was_tail_call) {
3492 pos.ScriptOffset(), func_index,
3494 summaries.frames.push_back(summary);
3497 at_conversion =
false;
3498 child_was_tail_call = was_tail_call;
3501 if (!child_was_tail_call) {
3502 int func_index = code->index();
3504 pos.ScriptOffset(), func_index,
3506 summaries.frames.push_back(summary);
3510 std::reverse(summaries.frames.begin(), summaries.frames.end());
3514bool WasmFrame::at_to_number_conversion()
const {
3518 wasm::WasmCode* wasm_code =
3523 int offset =
static_cast<int>(callee_pc() - wasm_code->instruction_start());
3524 int pos = wasm_code->GetSourceOffsetBefore(
offset);
3532 InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* entry =
3533 isolate()->inner_pointer_to_code_cache()->GetCacheEntry(callee_pc());
3534 CHECK(entry->code.has_value());
3536 if (code->builtin_id() != Builtin::kWasmToJsWrapperCSA) {
3547 Memory<Address>(callee_fp() + WasmToJSWrapperConstants::kSignatureOffset);
3549 return static_cast<intptr_t
>(maybe_sig) == -1;
3552int WasmFrame::LookupExceptionHandlerInTable() {
3553 wasm::WasmCode* code =
3555 if (!code->IsAnonymous() && code->handler_table_size() > 0) {
3556 HandlerTable table(code);
3557 int pc_offset =
static_cast<int>(
pc() - code->instruction_start());
3563void WasmDebugBreakFrame::Iterate(RootVisitor* v)
const {
3567 SafepointEntry safepoint_entry = pair.second;
3568 uint32_t tagged_register_indexes = safepoint_entry.tagged_register_indexes();
3570 while (tagged_register_indexes != 0) {
3572 tagged_register_indexes &= ~(1 << reg_code);
3573 FullObjectSlot spill_slot(&Memory<Address>(
3577 v->VisitRootPointer(Root::kStackRoots,
nullptr, spill_slot);
3581void WasmDebugBreakFrame::Print(StringStream* accumulator, PrintMode mode,
3583 PrintIndex(accumulator, mode, index);
3584 accumulator->Add(
"WasmDebugBreak");
3585 if (mode != OVERVIEW) accumulator->Add(
"\n");
3592 Memory<Address>(fp() + WasmFrameConstants::kWasmInstanceDataOffset)});
3594 CHECK(import_data->instance_data()->has_instance_object());
3595 return import_data->instance_data()->instance_object();
3599 return wasm_instance()->trusted_data(
isolate());
3602void JsToWasmFrame::Iterate(RootVisitor* v)
const {
3607#if V8_ENABLE_DRUMBRAKE
3611 Builtin::kGenericJSToWasmInterpreterWrapper);
3630 intptr_t scan_count = *
reinterpret_cast<intptr_t*
>(
3631 fp() + BuiltinWasmInterpreterWrapperConstants::kGCScanSlotCountOffset);
3633 FullObjectSlot spill_slot_base(&Memory<Address>(
sp()));
3634 FullObjectSlot spill_slot_limit(
3636 v->VisitRootPointers(Root::kStackRoots,
nullptr, spill_slot_base,
3641 uint32_t signature_data = *
reinterpret_cast<uint32_t*
>(
3642 fp() + BuiltinWasmInterpreterWrapperConstants::kSignatureDataOffset);
3650 bool is_args = *
reinterpret_cast<intptr_t*
>(
3651 fp() + BuiltinWasmInterpreterWrapperConstants::kArgRetsIsArgsOffset);
3652 if ((is_args && !has_ref_args) || (!is_args && !has_ref_rets))
return;
3655 size_t return_count = *
reinterpret_cast<size_t*
>(
3656 fp() + BuiltinWasmInterpreterWrapperConstants::kReturnCountOffset);
3657 size_t param_count = *
reinterpret_cast<size_t*
>(
3658 fp() + BuiltinWasmInterpreterWrapperConstants::kParamCountOffset);
3659 const wasm::ValueType* reps = *
reinterpret_cast<const wasm::ValueType**
>(
3660 fp() + BuiltinWasmInterpreterWrapperConstants::kSigRepsOffset);
3663 intptr_t slot_ptr = *
reinterpret_cast<intptr_t*
>(
3664 fp() + BuiltinWasmInterpreterWrapperConstants::kArgRetsAddressOffset);
3667 size_t current_index = *
reinterpret_cast<size_t*
>(
3668 fp() + BuiltinWasmInterpreterWrapperConstants::kCurrentIndexOffset);
3670 for (
size_t i = 0;
i < current_index;
i++) {
3671 wasm::ValueType type =
sig.GetParam(
i);
3672 if (type.is_reference()) {
3674 slot_ptr += (slot_ptr & 0x04);
3675 FullObjectSlot array_slot(&Memory<Address>(slot_ptr));
3676 v->VisitRootPointer(Root::kStackRoots,
nullptr, array_slot);
3679 switch (type.kind()) {
3686 slot_ptr +=
sizeof(int64_t);
3696 for (
size_t i = 0;
i < return_count;
i++) {
3697 wasm::ValueType type =
sig.GetReturn(
i);
3698 if (type.is_reference()) {
3700 slot_ptr += (slot_ptr & 0x04);
3701 FullObjectSlot array_slot(&Memory<Address>(slot_ptr));
3702 v->VisitRootPointer(Root::kStackRoots,
nullptr, array_slot);
3705 switch (type.kind()) {
3712 slot_ptr +=
sizeof(int64_t);
3725#if V8_ENABLE_DRUMBRAKE
3726void WasmToJsFrame::Iterate(RootVisitor* v)
const {
3732 Address limit_sp = *
reinterpret_cast<intptr_t*
>(
3733 fp() + WasmToJSInterpreterFrameConstants::kGCScanSlotLimitOffset);
3735 FullObjectSlot spill_slot_base(&Memory<Address>(
sp()));
3736 FullObjectSlot spill_slot_limit(limit_sp);
3737 v->VisitRootPointers(Root::kStackRoots,
nullptr, spill_slot_base,
3741 WasmFrame::Iterate(v);
3745void StackSwitchFrame::Iterate(RootVisitor* v)
const {
3751 intptr_t scan_count = Memory<intptr_t>(
3752 fp() + StackSwitchFrameConstants::kGCScanSlotCountOffset);
3754 FullObjectSlot spill_slot_base(&Memory<Address>(
sp()));
3755 FullObjectSlot spill_slot_limit(
3757 v->VisitRootPointers(Root::kStackRoots,
nullptr, spill_slot_base,
3760 FullObjectSlot instance_slot(
3761 &Memory<Address>(fp() + StackSwitchFrameConstants::kImplicitArgOffset));
3762 v->VisitRootPointer(Root::kStackRoots,
nullptr, instance_slot);
3763 FullObjectSlot result_array_slot(
3764 &Memory<Address>(fp() + StackSwitchFrameConstants::kResultArrayOffset));
3765 v->VisitRootPointer(Root::kStackRoots,
nullptr, result_array_slot);
3768#if V8_ENABLE_DRUMBRAKE
3769void WasmInterpreterEntryFrame::Iterate(RootVisitor* v)
const {
3786 FullObjectSlot slot_base(&Memory<Address>(fp() + kWasmInstanceObjOffset));
3787 FullObjectSlot slot_limit(
3789 v->VisitRootPointers(Root::kStackRoots,
nullptr, slot_base, slot_limit);
3792void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode,
3794 PrintIndex(accumulator, mode, index);
3795 accumulator->Add(
"WASM INTERPRETER ENTRY [");
3797 accumulator->PrintName(script->name());
3798 accumulator->Add(
"]");
3799 if (mode != OVERVIEW) accumulator->Add(
"\n");
3802FrameSummaries WasmInterpreterEntryFrame::Summarize()
const {
3803 FrameSummaries summaries;
3805 std::vector<WasmInterpreterStackEntry> interpreted_stack =
3807 trusted_instance_data()->interpreter_object(), fp());
3809 for (
auto& e : interpreted_stack) {
3810 FrameSummary::WasmInterpretedFrameSummary summary(
3811 isolate(), instance, e.function_index, e.byte_offset);
3812 summaries.frames.push_back(summary);
3818 return InstructionStream();
3823 fp() + WasmInterpreterFrameConstants::kWasmInstanceObjectOffset));
3828WasmInterpreterEntryFrame::trusted_instance_data()
const {
3829 return wasm_instance()->trusted_data(
isolate());
3832Tagged<Tuple2> WasmInterpreterEntryFrame::interpreter_object()
const {
3833 return trusted_instance_data()->interpreter_object();
3837 return trusted_instance_data()->module_object();
3840int WasmInterpreterEntryFrame::function_index(
3841 int inlined_function_index)
const {
3843 trusted_instance_data()->interpreter_object(), fp(),
3844 inlined_function_index);
3847int WasmInterpreterEntryFrame::position()
const {
3852 return trusted_instance_data()->native_context();
3855Address WasmInterpreterEntryFrame::GetCallerStackPointer()
const {
3861void StackSwitchFrame::GetStateForJumpBuffer(wasm::JumpBuffer* jmpbuf,
3864 DCHECK_EQ(ComputeFrameType(jmpbuf->fp), STACK_SWITCH);
3865 FillState(jmpbuf->fp, jmpbuf->sp, state);
3866 state->pc_address = &jmpbuf->pc;
3867 state->is_stack_exit_frame =
true;
3871int WasmLiftoffSetupFrame::GetDeclaredFunctionIndex()
const {
3877wasm::NativeModule* WasmLiftoffSetupFrame::GetNativeModule()
const {
3878 return Memory<wasm::NativeModule*>(
3882FullObjectSlot WasmLiftoffSetupFrame::wasm_instance_data_slot()
const {
3883 return FullObjectSlot(&Memory<Address>(
3887void WasmLiftoffSetupFrame::Iterate(RootVisitor* v)
const {
3888 FullObjectSlot spilled_instance_slot(&Memory<Address>(
3890 v->VisitRootPointer(Root::kStackRoots,
"spilled wasm instance",
3891 spilled_instance_slot);
3892 v->VisitRootPointer(Root::kStackRoots,
"wasm instance data",
3893 wasm_instance_data_slot());
3895 wasm::NativeModule* native_module = GetNativeModule();
3896 int func_index = GetDeclaredFunctionIndex() +
3897 native_module->module()->num_imported_functions;
3905 int num_int_params = 0;
3906 int num_ref_params = 0;
3908 native_module->module()->functions[func_index].sig;
3909 for (
auto param :
sig->parameters()) {
3914 }
else if (param.is_reference()) {
3920 if (num_ref_params == 0)
return;
3922 int num_int_params_in_registers =
3923 std::min(num_int_params,
3925 int num_ref_params_in_registers =
3926 std::min(num_ref_params,
3928 num_int_params_in_registers);
3930 for (
int i = 0;
i < num_ref_params_in_registers; ++
i) {
3931 FullObjectSlot spill_slot(
3933 [num_int_params_in_registers +
i]);
3935 v->VisitRootPointer(Root::kStackRoots,
"register parameter", spill_slot);
3939 wasm::WasmCode* wasm_code = native_module->GetCode(func_index);
3940 uint32_t first_tagged_stack_slot = wasm_code->first_tagged_parameter_slot();
3941 uint32_t num_tagged_stack_slots = wasm_code->num_tagged_parameter_slots();
3947 if (num_tagged_stack_slots > 0) {
3948 FullObjectSlot tagged_parameter_base(&Memory<Address>(caller_sp()));
3949 tagged_parameter_base += first_tagged_stack_slot;
3950 FullObjectSlot tagged_parameter_limit =
3951 tagged_parameter_base + num_tagged_stack_slots;
3953 v->VisitRootPointers(Root::kStackRoots,
"stack parameter",
3954 tagged_parameter_base, tagged_parameter_limit);
3961void PrintFunctionSource(StringStream* accumulator,
3963 if (
v8_flags.max_stack_trace_source_length != 0) {
3964 std::ostringstream os;
3965 os <<
"--------- s o u r c e c o d e ---------\n"
3966 << SourceCodeOf(shared,
v8_flags.max_stack_trace_source_length)
3967 <<
"\n-----------------------------------------\n";
3968 accumulator->Add(os.str().c_str());
3984 PrintIndex(accumulator, mode, index);
3985 PrintFrameKind(accumulator);
3986 if (IsConstructor()) accumulator->
Add(
"new ");
3988 accumulator->
Add(
" [%p]", function);
3996 if (IsScript(script_obj)) {
3998 accumulator->
Add(
" [");
4001 if (is_interpreted()) {
4005 int source_pos = bytecodes->SourcePosition(
offset);
4006 int line = script->GetLineNumber(source_pos) + 1;
4007 accumulator->
Add(
":%d] [bytecode=%p offset=%d]", line,
4008 reinterpret_cast<void*
>(bytecodes.ptr()),
offset);
4010 int function_start_pos = shared->StartPosition();
4011 int line = script->GetLineNumber(function_start_pos) + 1;
4012 accumulator->
Add(
":~%d] [pc=%p]", line,
reinterpret_cast<void*
>(
pc()));
4019 int parameters_count = ComputeParametersCount();
4020 for (
int i = 0;
i < parameters_count;
i++) {
4021 accumulator->
Add(
",");
4022 accumulator->
Add(
"%o", GetParameter(
i));
4025 accumulator->
Add(
")");
4026 if (mode == OVERVIEW) {
4027 accumulator->
Add(
"\n");
4030 if (is_optimized()) {
4031 accumulator->
Add(
" {\n// optimized frame\n");
4032 PrintFunctionSource(accumulator, *shared);
4033 accumulator->
Add(
"}\n");
4036 accumulator->
Add(
" {\n");
4039 int heap_locals_count = scope_info->ContextLocalCount();
4040 int expressions_count = ComputeExpressionsCount();
4044 if (IsContext(this->
context())) {
4046 while (context->IsWithContext()) {
4047 context = context->previous();
4048 DCHECK(!context.is_null());
4053 if (heap_locals_count > 0) {
4054 accumulator->
Add(
" // heap-allocated locals\n");
4057 accumulator->
Add(
" var ");
4059 accumulator->
Add(
" = ");
4060 if (!context.is_null()) {
4062 if (slot_index < context->
length()) {
4063 accumulator->
Add(
"%o", context->get(slot_index));
4066 "// warning: missing context slot - inconsistent frame?");
4069 accumulator->
Add(
"// warning: no context found - inconsistent frame?");
4071 accumulator->
Add(
"\n");
4075 if (0 < expressions_count) {
4076 accumulator->
Add(
" // expression stack (top to bottom)\n");
4078 for (
int i = expressions_count - 1;
i >= 0;
i--) {
4079 accumulator->
Add(
" [%02d] : %o\n",
i, GetExpression(
i));
4082 PrintFunctionSource(accumulator, *shared);
4084 accumulator->
Add(
"}\n\n");
4088 IteratePc(v, constant_pool_address(), GcSafeLookupCode());
4096 FullObjectSlot limit(&Memory<Address>(fp() + last_object_offset) + 1);
4108 FullObjectSlot limit(&Memory<Address>(fp() + last_object_offset) + 1);
4111 IteratePc(v, constant_pool_address(), GcSafeLookupCode());
4116 IteratePc(v, constant_pool_address(), code);
4123 if (code->has_tagged_outgoing_params()) IterateExpressions(v);
4133 uint32_t hashable_address;
4135 &hashable_address)) {
4136 return hashable_address;
4143InnerPointerToCodeCache::InnerPointerToCodeCacheEntry*
4148 uint32_t index = hash & (kInnerPointerToCodeCacheSize - 1);
4150 if (entry->inner_pointer == inner_pointer) {
4162 isolate_->heap()->GcSafeFindCodeForInnerPointer(inner_pointer));
4169 isolate_->heap()->GcSafeFindCodeForInnerPointer(inner_pointer);
4170 if (entry->code.value()->is_maglevved()) {
4171 entry->maglev_safepoint_entry.Reset();
4173 entry->safepoint_entry.Reset();
4175 entry->inner_pointer = inner_pointer;
4187constexpr int TopOfStackRegisterPaddingSlots() {
4206 int translation_height,
4207 bool is_topmost,
bool pad_arguments,
4209 const int locals_count = translation_height;
4211 register_stack_slot_count_ =
4214 static constexpr int kTheAccumulator = 1;
4215 static constexpr int kTopOfStackPadding = TopOfStackRegisterPaddingSlots();
4216 int maybe_additional_slots =
4218 ? (kTheAccumulator + kTopOfStackPadding)
4220 frame_size_in_bytes_without_fixed_ =
4221 (register_stack_slot_count_ + maybe_additional_slots) *
4227 const int parameter_padding_slots =
4229 const int fixed_frame_size =
4231 (parameters_count_with_receiver + parameter_padding_slots) *
4233 frame_size_in_bytes_ = frame_size_in_bytes_without_fixed_ + fixed_frame_size;
4238 int parameters_count) {
4248 const int parameters_count = translation_height;
4256 static constexpr int kTopOfStackPadding = TopOfStackRegisterPaddingSlots();
4257 static constexpr int kTheResult = 1;
4260 const int adjusted_height =
4262 ? parameters_count + argument_padding + kTheResult +
4264 : parameters_count + argument_padding;
4266 frame_size_in_bytes_ = frame_size_in_bytes_without_fixed_ +
4277 static constexpr int kTopOfStackPadding = TopOfStackRegisterPaddingSlots();
4278 static constexpr int kTheResult = 1;
4279 const int adjusted_height =
4281 (is_topmost ? kTheResult + kTopOfStackPadding : 0);
4283 frame_size_in_bytes_ = frame_size_in_bytes_without_fixed_ +
4288 int translation_height,
4297 const int parameters_count = translation_height;
4298 frame_has_result_stack_slot_ =
4300 const int result_slot_count =
4301 (frame_has_result_stack_slot_ || is_conservative) ? 1 : 0;
4303 const int exception_slot_count =
4304 (BuiltinContinuationModeIsWithCatch(continuation_mode) || is_conservative)
4308 const int allocatable_register_count =
4310 const int padding_slot_count =
4312 allocatable_register_count);
4314 const int register_parameter_count =
4316 translated_stack_parameter_count_ =
4317 parameters_count - register_parameter_count;
4318 stack_parameter_count_ = translated_stack_parameter_count_ +
4319 result_slot_count + exception_slot_count;
4320 const int stack_param_pad_count =
4328 static constexpr int kTopOfStackPadding = TopOfStackRegisterPaddingSlots();
4329 static constexpr int kTheResult = 1;
4330 const int push_result_count =
4331 (is_topmost || is_conservative) ? kTheResult + kTopOfStackPadding : 0;
4333 frame_size_in_bytes_ =
4335 allocatable_register_count + padding_slot_count +
4336 push_result_count) +
4339 frame_size_in_bytes_above_fp_ =
4341 push_result_count) +
constexpr size_t size() const
static constexpr int kPropertyCallbackInfoHolderIndex
static constexpr int kPropertyCallbackInfoArgsLength
static constexpr int kPropertyCallbackInfoReceiverIndex
static constexpr int kPropertyCallbackInfoReturnValueIndex
static constexpr int kPropertyCallbackInfoPropertyKeyIndex
FrameSummaries Summarize() const override
Tagged< Object > receiver() const
Tagged< Object > holder() const
void Print(StringStream *accumulator, PrintMode mode, int index) const override
Tagged< Name > property_name() const
static constexpr int kFunctionCallbackInfoNewTargetIndex
static constexpr int kFunctionCallbackInfoContextIndex
static constexpr int kFunctionCallbackInfoReturnValueIndex
static constexpr int kFunctionCallbackInfoTargetIndex
static constexpr int kFunctionCallbackInfoArgsLength
void Print(StringStream *accumulator, PrintMode mode, int index) const override
FullObjectSlot target_slot() const
DirectHandle< JSFunction > GetFunction() const
FrameSummaries Summarize() const override
void set_target(Tagged< HeapObject > function) const
DirectHandle< FunctionTemplateInfo > GetFunctionTemplateInfo() const
Tagged< Object > context() const override
Tagged< HeapObject > target() const
Tagged< Object > GetParameter(int i) const
DirectHandle< FixedArray > GetParameters() const
bool IsConstructor() const
Tagged< Object > receiver() const
int ComputeParametersCount() const
static V8_WARN_UNUSED_RESULT MaybeHandle< JSFunction > InstantiateFunction(Isolate *isolate, DirectHandle< NativeContext > native_context, DirectHandle< FunctionTemplateInfo > data, MaybeDirectHandle< Name > maybe_name={})
int GetBytecodeOffset() const override
void PatchContext(Tagged< Context > value)
intptr_t GetPCForBytecodeOffset(int lookup_offset) const
static BaselineFrame * cast(StackFrame *frame)
static int PaddingSlotCount(int register_count)
static constexpr int kFunctionOffset
static constexpr int kBuiltinContextOffset
static constexpr int kArgCOffset
static constexpr int kFrameSPtoFPDeltaAtDeoptimize
BuiltinContinuationFrameInfo(int translation_height, const CallInterfaceDescriptor &continuation_descriptor, const RegisterConfiguration *register_config, bool is_topmost, DeoptimizeKind deopt_kind, BuiltinContinuationMode continuation_mode, FrameInfoKind frame_info_kind)
static constexpr int kFirstArgumentOffset
static constexpr int kNumExtraArgsWithReceiver
bool IsConstructor() const
Tagged< Object > argc_slot_object() const
Tagged< Object > new_target_slot_object() const
Tagged< JSFunction > function() const
Tagged< Object > GetParameter(int i) const
void Print(StringStream *accumulator, PrintMode mode, int index) const override
int ComputeParametersCount() const
DirectHandle< FixedArray > GetParameters() const
Tagged< Object > receiver_slot_object() const
Tagged< Object > target_slot_object() const
FrameSummaries Summarize() const override
Tagged< Object > receiver() const
static constexpr int kFunctionOffset
static constexpr int kLengthOffset
int ComputeParametersCount() const override
Tagged< JSFunction > function() const override
V8_EXPORT_PRIVATE Tagged< Code > code(Builtin builtin)
static Builtin GetBuiltinFromBytecodeOffset(BytecodeOffset)
static V8_EXPORT_PRIVATE const char * NameForStackTrace(Isolate *isolate, Builtin builtin)
static V8_EXPORT_PRIVATE const char * name(Builtin builtin)
static constexpr BytecodeOffset None()
int GetRegisterParameterCount() const
static constexpr int kContextOrFrameTypeOffset
static constexpr int kConstantPoolOffset
static constexpr int kCallerSPOffset
static constexpr int kCPSlotSize
static constexpr int kCallerFPOffset
static constexpr int kCallerPCOffset
static constexpr int kFixedFrameSizeAboveFp
virtual int ComputeParametersCount() const
Address GetParameterSlot(int index) const
FrameSummaries Summarize() const override
Tagged< HeapObject > unchecked_code() const override
virtual bool IsConstructor() const
virtual int LookupExceptionHandlerInTable(int *data, HandlerTable::CatchPrediction *prediction)
DirectHandle< FixedArray > GetParameters() const
static bool IsConstructFrame(Address fp)
virtual Tagged< JSFunction > function() const =0
virtual Tagged< Object > GetParameter(int index) const
virtual Tagged< Object > receiver() const
Address GetCallerStackPointer() const override
int ComputeExpressionsCount() const
virtual Tagged< Object > context() const
void ComputeCallerState(State *state) const override
bool HasTaggedOutgoingParams(Tagged< GcSafeCode > code_lookup) const
Address caller_fp() const
void IterateTurbofanJSOptimizedFrame(RootVisitor *v) const
virtual int position() const
Address caller_pc() const
void IterateExpressions(RootVisitor *v) const
virtual FrameSummaries Summarize() const
static CommonFrame * cast(StackFrame *frame)
virtual Address GetExpressionAddress(int n) const
Tagged< HeapObject > unchecked_code() const override
static constexpr int kLengthOffset
static constexpr int kLastObjectOffset
void Iterate(RootVisitor *v) const override
ConstructStubFrameInfo(int translation_height, bool is_topmost, FrameInfoKind frame_info_kind)
static constexpr int kReturnValueIndex
bool is_javascript() const
int FrameFunctionCount() const
CommonFrame * frame() const
DebuggableStackFrameIterator(Isolate *isolate)
FrameSummary GetTopValidFrame() const
StackFrameIterator iterator_
static bool IsValidFrame(StackFrame *frame)
static void DeoptimizeFunction(Tagged< JSFunction > function, LazyDeoptimizeReason reason, Tagged< Code > code={})
static V8_INLINE DirectHandle FromSlot(Address *slot)
static EmbeddedData FromBlob()
static constexpr int kNextFastCallFrameFPOffset
static constexpr int kNextExitFrameFPOffset
static constexpr int kNextFastCallFramePCOffset
Tagged< HeapObject > unchecked_code() const override
Type GetCallerState(State *state) const override
void Iterate(RootVisitor *v) const override
void ComputeCallerState(State *state) const override
static constexpr int kSPOffset
void ComputeCallerState(State *state) const override
static StackFrame::Type ComputeFrameType(Address fp)
static void FillState(Address fp, Address sp, State *state)
Type type() const override
void Iterate(RootVisitor *v) const override
static Address ComputeStackPointer(Address fp)
static Type GetStateForFramePointer(Address fp, State *state)
Address * callback_entrypoint_address()
Address JSStackComparableAddress()
ExternalCallbackScope * previous()
Handle< FixedArray > NewFixedArray(int length, AllocationType allocation=AllocationType::kYoung)
FastConstructStubFrameInfo(bool is_topmost)
bool AreSourcePositionsAvailable() const
DirectHandle< Context > native_context() const
int SourcePosition() const
DirectHandle< StackFrameInfo > CreateStackFrameInfo() const
int SourceStatementPosition() const
bool is_subject_to_debugging() const
Handle< AbstractCode > abstract_code() const
JavaScriptFrameSummary(Isolate *isolate, Tagged< Object > receiver, Tagged< JSFunction > function, Tagged< AbstractCode > abstract_code, int code_offset, bool is_constructor, Tagged< FixedArray > parameters)
void EnsureSourcePositionsAvailable()
Handle< Object > script() const
static FrameSummary GetTop(const CommonFrame *frame)
bool is_subject_to_debugging() const
static FrameSummary Get(const CommonFrame *frame, int index)
DirectHandle< Context > native_context() const
int SourceStatementPosition() const
bool is_constructor() const
static FrameSummary GetSingle(const CommonFrame *frame)
Handle< Object > script() const
DirectHandle< StackFrameInfo > CreateStackFrameInfo() const
static FrameSummary GetBottom(const CommonFrame *frame)
Handle< Object > receiver() const
void EnsureSourcePositionsAvailable()
int SourcePosition() const
bool AreSourcePositionsAvailable() const
static constexpr int kTargetIndex
static constexpr int kArgsLength
static constexpr int kNewTargetIndex
static constexpr int kContextIndex
static const int kNoHandlerFound
static const int kLazyDeopt
static bool IsSelfForwarded(Tagged< HeapObject > object)
static constexpr int kHeaderSize
std::optional< Tagged< GcSafeCode > > GcSafeTryFindCodeForInnerPointer(Address inner_pointer)
static V8_INLINE ICStats * instance()
InnerPointerToCodeCacheEntry * GetCacheEntry(Address inner_pointer)
void Iterate(RootVisitor *v) const override
static InterpretedFrame * cast(StackFrame *frame)
void PatchBytecodeOffset(int new_offset)
void PatchBytecodeArray(Tagged< BytecodeArray > bytecode_array)
int GetBytecodeOffset() const override
static constexpr int kBytecodeOffsetFromFp
static constexpr int kBytecodeOffsetExpressionIndex
static Address c_entry_fp(ThreadLocalTop *thread)
Address code_cage_base() const
const IsolateData * isolate_data() const
InnerPointerToCodeCache * inner_pointer_to_code_cache()
v8::internal::Factory * factory()
static Address handler(ThreadLocalTop *thread)
static DirectHandle< String > GetDebugName(DirectHandle< JSFunction > function)
Tagged< JSFunction > function() const override
Tagged< Object > context() const override
intptr_t GetSPToFPDelta() const
int ComputeParametersCount() const override
void SetException(Tagged< Object > exception)
bool IsConstructor() const override
Address GetCallerStackPointer() const override
Tagged< JSFunction > function() const override
void Print(StringStream *accumulator, PrintMode mode, int index) const override
Tagged< Object > function_slot_object() const
void SetParameterValue(int index, Tagged< Object > value) const
void Iterate(RootVisitor *v) const override
static void CollectFunctionAndOffsetForICStats(Isolate *isolate, Tagged< JSFunction > function, Tagged< AbstractCode > code, int code_offset)
virtual void GetFunctions(std::vector< Tagged< SharedFunctionInfo > > *functions) const
static void PrintTop(Isolate *isolate, FILE *file, bool print_args, bool print_line_number)
int GetActualArgumentCount() const override
Tagged< Script > script() const
std::tuple< Tagged< AbstractCode >, int > GetActiveCodeAndOffset() const
static void PrintFunctionAndOffset(Isolate *isolate, Tagged< JSFunction > function, Tagged< AbstractCode > code, int code_offset, FILE *file, bool print_line_number)
Tagged< Object > unchecked_function() const
Tagged< Object > context() const override
V8_EXPORT_PRIVATE void Advance()
StackFrameIterator iterator_
BytecodeOffset GetBytecodeOffsetForOSR() const
DirectHandle< JSFunction > GetInnermostFunction() const
int FindReturnPCForTrampoline(Tagged< Code > code, int trampoline_pc) const override
void Iterate(RootVisitor *v) const override
uint32_t num_tagged_slots() const
uint32_t tagged_register_indexes() const
uint8_t num_extra_spill_slots() const
MaglevSafepointEntry FindEntry(Address pc) const
int find_return_pc(int pc_offset)
bool IsForwardingAddress() const
Tagged< HeapObject > ToForwardingAddress(Tagged< HeapObject > map_word_host)
static V8_INLINE MemoryChunk * FromHeapObject(Tagged< HeapObject > object)
void ComputeCallerState(State *state) const override
static bool TryGetAddressForHashing(Isolate *isolate, Address address, uint32_t *hashable_address)
static Builtin TryLookupCode(Isolate *isolate, Address address)
FrameSummaries Summarize() const override
void GetFunctions(std::vector< Tagged< SharedFunctionInfo > > *functions) const override
int LookupExceptionHandlerInTable(int *data, HandlerTable::CatchPrediction *prediction) override
static int StackSlotOffsetRelativeToFp(int slot_index)
Tagged< DeoptimizationData > GetDeoptimizationData(Tagged< Code > code, int *deopt_index) const
static V8_INLINE void ReplacePC(Address *pc_address, Address new_pc, int offset_from_sp)
static constexpr int kThisIndex
static constexpr int kPropertyKeyIndex
static constexpr int kArgsLength
static constexpr int kHolderIndex
constexpr int8_t code() const
static const RegisterConfiguration * Default()
int num_allocatable_general_registers() const
virtual void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end)=0
virtual void VisitRunningCode(FullObjectSlot code_slot, FullObjectSlot istream_or_smi_zero_slot)
virtual void VisitRootPointer(Root root, const char *description, FullObjectSlot p)
static constexpr int kNoDeoptIndex
bool has_deoptimization_index() const
int deoptimization_index() const
base::Vector< const uint8_t > tagged_slots() const
SafepointEntry FindEntry(Address pc) const
int find_return_pc(int pc_offset)
static LocalNamesRange< DirectHandle< ScopeInfo > > IterateLocalNames(DirectHandle< ScopeInfo > scope_info)
static void EnsureSourcePositionsAvailable(Isolate *isolate, DirectHandle< SharedFunctionInfo > shared_info)
static constexpr int ToInt(const Tagged< Object > object)
static constexpr Tagged< Smi > FromInt(int value)
Isolate * isolate() const
StackFrameIteratorBase(const StackFrameIteratorBase &)=delete
void SetNewFrame(StackFrame::Type type, StackFrame::State *state)
StackFrameIteratorForProfilerForTesting(Isolate *isolate, Address pc, Address fp, Address sp, Address lr, Address js_entry_sp)
bool IsValidStackAddress(Address addr) const
bool IsValidTop(ThreadLocalTop *top) const
bool IsValidState(const StackFrame::State &frame) const
StackFrameIteratorForProfiler(Isolate *isolate, Address pc, Address fp, Address sp, Address lr, Address js_entry_sp)
StackFrame::Type top_frame_type_
bool HasValidExitIfEntryFrame(const StackFrame *frame) const
bool IsValidExitFrame(Address fp) const
bool IsNoFrameBytecodeHandlerPc(Isolate *isolate, Address pc, Address fp) const
StackFrame::Type ComputeStackFrameType(StackFrame::State *state) const override
ExternalCallbackScope * external_callback_scope_
Address top_link_register_
StackFrame * frame() const
static bool IsValidFrameType(StackFrame::Type type)
V8_EXPORT_PRIVATE void Advance()
StackFrame * frame() const
void Reset(ThreadLocalTop *top)
V8_EXPORT_PRIVATE StackFrameIterator(Isolate *isolate)
StackFrame::Type ComputeStackFrameType(StackFrame::State *state) const override
V8_EXPORT_PRIVATE Tagged< GcSafeCode > GcSafeLookupCode() const
Address unauthenticated_pc() const
bool is_builtin_exit() const
V8_EXPORT_PRIVATE Tagged< Code > LookupCode() const
static ReturnAddressLocationResolver return_address_location_resolver_
V8_EXPORT_PRIVATE std::pair< Tagged< Code >, int > LookupCodeAndOffset() const
Address caller_sp() const
static constexpr bool IsTypeMarker(uintptr_t function_or_marker)
static constexpr Type MarkerToType(intptr_t marker)
virtual Type type() const =0
bool is_javascript() const
virtual void ComputeCallerState(State *state) const =0
Address * pc_address() const
Isolate * isolate() const
static Address * ResolveReturnAddressLocation(Address *pc_address)
bool is_api_callback_exit() const
virtual void Iterate(RootVisitor *v) const =0
Address callee_pc() const
const StackFrameIteratorBase *const iterator_
virtual Type GetCallerState(State *state) const
Address * constant_pool_address() const
bool is_construct_entry() const
V8_EXPORT_PRIVATE std::pair< Tagged< GcSafeCode >, int > GcSafeLookupCodeAndOffset() const
static void SetReturnAddressLocationResolver(ReturnAddressLocationResolver resolver)
bool is_interpreted() const
virtual void Print(StringStream *accumulator, PrintMode mode, int index) const
bool is_optimized_js() const
Address maybe_unauthenticated_pc() const
bool is_api_accessor_exit() const
void IteratePc(RootVisitor *v, Address *constant_pool_address, Tagged< GcSafeCode > holder) const
static Address ReadPC(Address *pc_address)
static const int kPaddingOffset
StackHandlerIterator(const StackFrame *frame, StackHandler *handler)
StackHandler * handler() const
static StackHandler * FromAddress(Address address)
StackHandler * next() const
static constexpr int kExpressionsOffset
static constexpr int kContextOffset
static constexpr int kFixedFrameSizeFromFp
static constexpr int kFixedSlotCount
static constexpr int kLastObjectOffset
static constexpr int kArgCOffset
static constexpr int kFunctionOffset
static constexpr int kFixedFrameSize
void PrintFunction(Isolate *isolate, Tagged< JSFunction > function, Tagged< Object > receiver)
void PrintSecurityTokenIfChanged(Isolate *isolate, Tagged< JSFunction > function)
void Add(const char *format)
void PrintName(Tagged< Object > o)
Tagged< HeapObject > unchecked_code() const override
FrameSummaries Summarize() const override
int LookupExceptionHandlerInTable()
static bool CanLookupStartOfJitAllocationAt(Address inner_pointer)
@ kJavaScriptBuiltinContinuationWithCatch
@ kJavaScriptBuiltinContinuation
void Prepare(Address stack_frame_pointer)
int FindReturnPCForTrampoline(Tagged< Code > code, int trampoline_pc) const override
void Iterate(RootVisitor *v) const override
int ComputeParametersCount() const override
Tagged< HeapObject > unchecked_code() const override
void Iterate(RootVisitor *v) const override
static constexpr int kFixedFrameSize
static constexpr int kFixedFrameSizeFromFp
static constexpr int kFrameTypeOffset
void Iterate(RootVisitor *v) const override
void IterateParamsOfGenericWasmToJSWrapper(RootVisitor *v) const
void Iterate(RootVisitor *v) const override
void IterateParamsOfOptimizedWasmToJSWrapper(RootVisitor *v) const
static constexpr int kExpressionsOffset
static constexpr int kBytecodeArrayExpressionIndex
static constexpr int kBytecodeArrayFromFp
static constexpr int kRegisterFileExpressionIndex
static int RegisterStackSlotCount(int register_count)
static constexpr int kRegisterFileFromFp
static uint32_t GetStackSizeForAdditionalArguments(int parameters_count)
UnoptimizedFrameInfo(int parameters_count_with_receiver, int translation_height, bool is_topmost, bool pad_arguments, FrameInfoKind frame_info_kind)
Address GetExpressionAddress(int n) const override
Tagged< BytecodeArray > GetBytecodeArray() const
Tagged< Object > ReadInterpreterRegister(int register_index) const
int LookupExceptionHandlerInTable(int *data, HandlerTable::CatchPrediction *prediction) override
FrameSummaries Summarize() const override
int position() const override
static V8_INLINE Tagged_t CompressObject(Address tagged)
static V8_INLINE Address DecompressTagged(TOnHeapAddress on_heap_addr, Tagged_t raw_value)
static int GetPushedGpRegisterOffset(int reg_code)
static int GetFunctionIndex(Tagged< Tuple2 > interpreter_object, Address frame_pointer, int index)
static std::vector< WasmInterpreterStackEntry > GetInterpretedStack(Tagged< Tuple2 > interpreter_object, Address frame_pointer)
static constexpr int kParameterSpillsOffset[]
static constexpr int kInstanceSpillOffset
static constexpr int kNumberOfSavedGpParamRegs
static constexpr int kWasmInstanceDataOffset
static constexpr int kNativeModuleOffset
static constexpr int kDeclaredFunctionIndexOffset
std::pair< WasmCode *, SafepointEntry > LookupCodeAndSafepoint(Isolate *isolate, Address pc)
WasmCode * LookupCode(Isolate *isolate, Address pc) const
#define V8_EXTERNAL_CODE_SPACE_BOOL
#define HAS_SMI_TAG(value)
#define V8_EMBEDDED_CONSTANT_POOL_BOOL
const JSFunctionRef function_
Handle< SharedFunctionInfo > info
ZoneList< RegExpInstruction > code_
#define FRAME_TYPE_CASE(type, class)
#define FRAME_SUMMARY_DESTR(kind, type, field, desc)
#define FRAME_SUMMARY_DISPATCH(ret, name)
#define STACK_FRAME_TYPE_LIST(V)
SharedFunctionInfoRef shared
ZoneVector< RpoNumber > & result
ZoneStack< RpoNumber > & stack
LiftoffAssembler::CacheState state
base::SmallVector< int32_t, 1 > stack_slots
#define MSAN_MEMORY_IS_INITIALIZED(start, size)
constexpr unsigned CountTrailingZeros(T value)
constexpr bool IsPowerOfTwo(T value)
V8_INLINE Dest bit_cast(Source const &source)
constexpr int kAnonymousFuncIndex
constexpr Register kGpParamRegisters[]
constexpr DoubleRegister kFpParamRegisters[]
WasmCodeManager * GetWasmCodeManager()
TypeCanonicalizer * GetTypeCanonicalizer()
constexpr WasmCodePosition kNoCodePosition
constexpr IndependentValueType kWasmI32
int GetSourcePosition(const WasmModule *module, uint32_t func_index, uint32_t byte_offset, bool is_at_number_conversion)
Signature< ValueType > FunctionSig
constexpr IndependentValueType kWasmI64
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr int kFunctionEntryBytecodeOffset
constexpr bool CodeKindIsOptimizedJSFunction(CodeKind kind)
constexpr int kBitsPerByte
const char * CodeKindToMarker(CodeKind kind, bool context_specialized)
void PrintF(const char *format,...)
constexpr int kPCOnStackSize
Tagged(T object) -> Tagged< T >
uint32_t ComputeUnseededHash(uint32_t key)
kWasmInternalFunctionIndirectPointerTag instance_data
bool IsTranslationInterpreterFrameOpcode(TranslationOpcode o)
int TranslationOpcodeOperandCount(TranslationOpcode o)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
@ JAVASCRIPT_HANDLE_EXCEPTION
kInterpreterTrampolineOffset Tagged< HeapObject >
constexpr Register kJavaScriptCallArgCountRegister
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
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
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
Tagged< T > GCSafeCast(Tagged< Object > object, const Heap *heap)
constexpr bool IsAnyTagged(MachineRepresentation rep)
constexpr int kJSArgcReceiverSlots
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset Tagged< WasmInstanceObject >
constexpr int kSystemPointerSize
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
void ShortPrint(Tagged< Object > obj, FILE *out)
V8_EXPORT_PRIVATE FlagValues v8_flags
static uint32_t ObjectAddressForHashing(Address object)
constexpr int ArgumentPaddingSlots(int argument_count)
static constexpr Address kNullAddress
constexpr int kDoubleSize
DirectHandle< String > GetWasmFunctionDebugName(Isolate *isolate, DirectHandle< WasmTrustedInstanceData > instance_data, uint32_t func_index)
constexpr bool CodeKindCanDeoptimize(CodeKind kind)
!IsContextMap !IsContextMap native_context
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
uintptr_t(*)(uintptr_t return_addr_location) ReturnAddressLocationResolver
static constexpr AcquireLoadTag kAcquireLoad
#define DCHECK_LE(v1, v2)
#define CHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr bool IsAligned(T value, U alignment)
std::vector< FrameSummary > frames
bool top_frame_is_construct_call
const char * function_name
std::optional< Tagged< GcSafeCode > > code
bool is_profiler_entry_frame
EmbedderRootsHandler * handler_
#define V8_LIKELY(condition)