5#ifndef V8_EXECUTION_FRAMES_H_
6#define V8_EXECUTION_FRAMES_H_
18#if V8_ENABLE_WEBASSEMBLY
70class ExternalCallbackScope;
71class InnerPointerToCodeCache;
77class StackFrameIteratorBase;
80class WasmInstanceObject;
81class WasmModuleObject;
83#if V8_ENABLE_DRUMBRAKE
115#define STACK_FRAME_TYPE_LIST(V) \
116 V(ENTRY, EntryFrame) \
117 V(CONSTRUCT_ENTRY, ConstructEntryFrame) \
119 IF_WASM(V, WASM, WasmFrame) \
120 IF_WASM(V, WASM_TO_JS, WasmToJsFrame) \
121 IF_WASM(V, WASM_TO_JS_FUNCTION, WasmToJsFunctionFrame) \
122 IF_WASM(V, JS_TO_WASM, JsToWasmFrame) \
123 IF_WASM(V, STACK_SWITCH, StackSwitchFrame) \
124 IF_WASM_DRUMBRAKE(V, WASM_INTERPRETER_ENTRY, WasmInterpreterEntryFrame) \
125 IF_WASM(V, WASM_DEBUG_BREAK, WasmDebugBreakFrame) \
126 IF_WASM(V, C_WASM_ENTRY, CWasmEntryFrame) \
127 IF_WASM(V, WASM_EXIT, WasmExitFrame) \
128 IF_WASM(V, WASM_LIFTOFF_SETUP, WasmLiftoffSetupFrame) \
129 IF_WASM(V, WASM_SEGMENT_START, WasmSegmentStartFrame) \
130 V(INTERPRETED, InterpretedFrame) \
131 V(BASELINE, BaselineFrame) \
132 V(MAGLEV, MaglevFrame) \
133 V(TURBOFAN_JS, TurbofanJSFrame) \
135 V(TURBOFAN_STUB_WITH_CONTEXT, TurbofanStubWithContextFrame) \
136 V(BUILTIN_CONTINUATION, BuiltinContinuationFrame) \
137 V(JAVASCRIPT_BUILTIN_CONTINUATION, JavaScriptBuiltinContinuationFrame) \
138 V(JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH, \
139 JavaScriptBuiltinContinuationWithCatchFrame) \
140 V(INTERNAL, InternalFrame) \
141 V(CONSTRUCT, ConstructFrame) \
142 V(FAST_CONSTRUCT, FastConstructFrame) \
143 V(BUILTIN, BuiltinFrame) \
144 V(BUILTIN_EXIT, BuiltinExitFrame) \
145 V(API_CALLBACK_EXIT, ApiCallbackExitFrame) \
146 V(API_ACCESSOR_EXIT, ApiAccessorExitFrame) \
147 V(NATIVE, NativeFrame) \
148 V(IRREGEXP, IrregexpFrame)
153#define DECLARE_TYPE(type, ignore) type,
216 static_assert((std::numeric_limits<uintptr_t>::max() >>
kSmiTagSize) >
217 Type::NUMBER_OF_TYPES);
219 function_or_marker < (Type::NUMBER_OF_TYPES <<
kSmiTagSize);
227 state_(original.state_) {}
234 static_assert(TURBOFAN_JS == MAGLEV + 1);
238 static_assert(BASELINE == INTERPRETED + 1);
245#if V8_ENABLE_WEBASSEMBLY
246 bool is_wasm()
const {
247 return this->
type() == WASM || this->
type() == WASM_SEGMENT_START
248#ifdef V8_ENABLE_DRUMBRAKE
249 || this->
type() == WASM_INTERPRETER_ENTRY
253 bool is_c_wasm_entry()
const {
return type() == C_WASM_ENTRY; }
254 bool is_wasm_liftoff_setup()
const {
return type() == WASM_LIFTOFF_SETUP; }
255#if V8_ENABLE_DRUMBRAKE
256 bool is_wasm_interpreter_entry()
const {
257 return type() == WASM_INTERPRETER_ENTRY;
260 bool is_wasm_debug_break()
const {
return type() == WASM_DEBUG_BREAK; }
261 bool is_wasm_to_js()
const {
262 return type() == WASM_TO_JS ||
type() == WASM_TO_JS_FUNCTION;
264 bool is_js_to_wasm()
const {
return type() == JS_TO_WASM; }
269 return type() == BUILTIN_CONTINUATION;
272 return type() == JAVASCRIPT_BUILTIN_CONTINUATION;
275 return type() == JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH;
285 static_assert(INTERPRETED + 1 == BASELINE);
286 static_assert(BASELINE + 1 == MAGLEV);
287 static_assert(MAGLEV + 1 == TURBOFAN_JS);
288 return t >= INTERPRETED && t <= TURBOFAN_JS;
413#define FRAME_SUMMARY_VARIANTS(F) \
414 F(JAVASCRIPT, JavaScriptFrameSummary, javascript_summary_, JavaScript) \
415 IF_WASM(F, BUILTIN, BuiltinFrameSummary, builtin_summary_, Builtin) \
416 IF_WASM(F, WASM, WasmFrameSummary, wasm_summary_, Wasm) \
417 IF_WASM_DRUMBRAKE(F, WASM_INTERPRETED, WasmInterpretedFrameSummary, \
418 wasm_interpreted_summary_, WasmInterpreted) \
419 IF_WASM(F, WASM_INLINED, WasmInlinedFrameSummary, wasm_inlined_summary_, \
422#define FRAME_SUMMARY_KIND(kind, type, field, desc) kind,
424#undef FRAME_SUMMARY_KIND
445 void EnsureSourcePositionsAvailable();
446 bool AreSourcePositionsAvailable()
const;
454 bool is_subject_to_debugging()
const;
456 int SourceStatementPosition()
const;
470#if V8_ENABLE_WEBASSEMBLY
473 WasmFrameSummary(
Isolate* isolate,
476 bool at_to_number_conversion);
479 uint32_t function_index()
const;
482 int code_offset()
const {
return byte_offset_; }
483 bool is_constructor()
const {
return false; }
484 bool is_subject_to_debugging()
const {
return true; }
485 int SourcePosition()
const;
486 int SourceStatementPosition()
const {
return SourcePosition(); }
487 Handle<Script> script()
const;
488 DirectHandle<WasmInstanceObject> wasm_instance()
const;
489 DirectHandle<WasmTrustedInstanceData> wasm_trusted_instance_data()
const {
490 return instance_data_;
493 bool at_to_number_conversion()
const {
return at_to_number_conversion_; }
494 DirectHandle<StackFrameInfo> CreateStackFrameInfo()
const;
497 Handle<WasmTrustedInstanceData> instance_data_;
498 bool at_to_number_conversion_;
499 wasm::WasmCode*
code_;
506 class WasmInlinedFrameSummary :
public FrameSummaryBase {
508 WasmInlinedFrameSummary(Isolate* isolate,
509 Handle<WasmTrustedInstanceData> instance_data,
510 int function_index,
int op_wire_bytes_offset);
512 DirectHandle<WasmInstanceObject> wasm_instance()
const;
513 DirectHandle<WasmTrustedInstanceData> wasm_trusted_instance_data()
const {
514 return instance_data_;
517 uint32_t function_index()
const;
518 int code_offset()
const {
return op_wire_bytes_offset_; }
520 bool is_subject_to_debugging()
const {
return true; }
521 Handle<Script> script()
const;
522 int SourcePosition()
const;
523 int SourceStatementPosition()
const {
return SourcePosition(); }
525 DirectHandle<StackFrameInfo> CreateStackFrameInfo()
const;
528 Handle<WasmTrustedInstanceData> instance_data_;
530 int op_wire_bytes_offset_;
533 class BuiltinFrameSummary :
public FrameSummaryBase {
535 BuiltinFrameSummary(Isolate*, Builtin);
540 int code_offset()
const {
return 0; }
542 bool is_subject_to_debugging()
const {
return false; }
543 Handle<Object> script()
const;
545 int SourceStatementPosition()
const {
return 0; }
547 DirectHandle<StackFrameInfo> CreateStackFrameInfo()
const;
553#if V8_ENABLE_DRUMBRAKE
554 class WasmInterpretedFrameSummary :
public FrameSummaryBase {
556 WasmInterpretedFrameSummary(Isolate*, Handle<WasmInstanceObject>,
557 uint32_t function_index,
int byte_offset);
558 Handle<WasmInstanceObject> wasm_instance()
const {
return wasm_instance_; }
560 uint32_t function_index()
const {
return function_index_; }
561 int byte_offset()
const {
return byte_offset_; }
564 int code_offset()
const {
return byte_offset_; }
566 bool is_subject_to_debugging()
const {
return true; }
567 int SourcePosition()
const;
568 int SourceStatementPosition()
const {
return SourcePosition(); }
569 Handle<Script> script()
const;
571 DirectHandle<StackFrameInfo> CreateStackFrameInfo()
const;
574 Handle<WasmInstanceObject> wasm_instance_;
575 uint32_t function_index_;
581#define FRAME_SUMMARY_CONS(kind, type, field, desc) \
582 FrameSummary(type summ) : field(summ) {}
584#undef FRAME_SUMMARY_CONS
588 static FrameSummary GetTop(
const CommonFrame* frame);
589 static FrameSummary GetBottom(
const CommonFrame* frame);
590 static FrameSummary GetSingle(
const CommonFrame* frame);
591 static FrameSummary Get(
const CommonFrame* frame,
int index);
593 void EnsureSourcePositionsAvailable();
594 bool AreSourcePositionsAvailable()
const;
607#define FRAME_SUMMARY_CAST(kind_, type, field, desc) \
608 bool Is##desc() const { return base_.kind() == kind_; } \
609 const type& As##desc() const { \
610 DCHECK_EQ(base_.kind(), kind_); \
614#undef FRAME_SUMMARY_CAST
617#define FRAME_SUMMARY_FIELD(kind, type, field, desc) type field;
622#undef FRAME_SUMMARY_FIELD
637 frames.push_back(summary);
640 int size()
const {
return static_cast<int>(frames.size()); }
692 Type type()
const override {
return TURBOFAN_STUB_WITH_CONTEXT; }
785 int index)
const override;
813 FILE* file,
bool print_line_number);
816 bool print_line_number);
936 Type type()
const override {
return BUILTIN_EXIT; }
949 int index)
const override;
973 Type type()
const override {
return API_CALLBACK_EXIT; }
992 int index)
const override;
1023 Type type()
const override {
return API_ACCESSOR_EXIT; }
1031 int index)
const override;
1082 int* deopt_index)
const;
1091 int trampoline_pc)
const = 0;
1207 int trampoline_pc)
const override;
1230 int trampoline_pc)
const override;
1262#if V8_ENABLE_WEBASSEMBLY
1265 Type type()
const override {
return WASM; }
1268 void Print(StringStream* accumulator, PrintMode mode,
1269 int index)
const override;
1272 int LookupExceptionHandlerInTable();
1274 void Iterate(RootVisitor* v)
const override;
1278 virtual Tagged<WasmTrustedInstanceData> trusted_instance_data()
const;
1281 virtual wasm::WasmCode* wasm_code()
const;
1282 int function_index()
const;
1283 Tagged<Script> script()
const;
1286 Tagged<Object>
context()
const override;
1287 bool at_to_number_conversion()
const;
1289 int generated_code_offset()
const;
1290 bool is_inspectable()
const;
1292 FrameSummaries Summarize()
const override;
1296#ifdef V8_ENABLE_DRUMBRAKE
1297 && !frame->is_wasm_interpreter_entry()
1300 return static_cast<WasmFrame*
>(frame);
1304 inline explicit WasmFrame(StackFrameIteratorBase* iterator);
1307 friend class StackFrameIteratorBase;
1308 Tagged<WasmModuleObject> module_object()
const;
1315class WasmSegmentStartFrame :
public WasmFrame {
1319 Type
type()
const override {
return WASM; }
1322 inline explicit WasmSegmentStartFrame(StackFrameIteratorBase* iterator);
1325 friend class StackFrameIteratorBase;
1329class WasmExitFrame :
public WasmFrame {
1331 Type
type()
const override {
return WASM_EXIT; }
1332 static Address ComputeStackPointer(Address fp);
1335 inline explicit WasmExitFrame(StackFrameIteratorBase* iterator);
1338 friend class StackFrameIteratorBase;
1341#if V8_ENABLE_DRUMBRAKE
1342class WasmInterpreterEntryFrame final :
public WasmFrame {
1344 Type
type()
const override {
return WASM_INTERPRETER_ENTRY; }
1347 void Iterate(RootVisitor* v)
const override;
1350 void Print(StringStream* accumulator, PrintMode mode,
1351 int index)
const override;
1353 FrameSummaries Summarize()
const override;
1356 Tagged<HeapObject> unchecked_code()
const override;
1359 Tagged<Tuple2> interpreter_object()
const;
1361 Tagged<WasmTrustedInstanceData> trusted_instance_data()
const override;
1363 wasm::WasmCode* wasm_code()
const override {
UNREACHABLE(); }
1364 int function_index(
int inlined_function_index)
const;
1366 Tagged<Object>
context()
const override;
1368 static WasmInterpreterEntryFrame*
cast(StackFrame* frame) {
1369 DCHECK(frame->is_wasm_interpreter_entry());
1370 return static_cast<WasmInterpreterEntryFrame*
>(frame);
1374 inline explicit WasmInterpreterEntryFrame(StackFrameIteratorBase* iterator);
1376 Address GetCallerStackPointer()
const override;
1379 friend class StackFrameIteratorBase;
1380 Tagged<WasmModuleObject> module_object()
const;
1384class WasmDebugBreakFrame final :
public TypedFrame {
1386 Type
type()
const override {
return WASM_DEBUG_BREAK; }
1389 void Iterate(RootVisitor* v)
const override;
1391 void Print(StringStream* accumulator, PrintMode mode,
1392 int index)
const override;
1394 static WasmDebugBreakFrame*
cast(StackFrame* frame) {
1395 DCHECK(frame->is_wasm_debug_break());
1396 return static_cast<WasmDebugBreakFrame*
>(frame);
1400 inline explicit WasmDebugBreakFrame(StackFrameIteratorBase*);
1403 friend class StackFrameIteratorBase;
1406class WasmToJsFrame :
public WasmFrame {
1408 Type
type()
const override {
return WASM_TO_JS; }
1410#if V8_ENABLE_DRUMBRAKE
1411 void Iterate(RootVisitor* v)
const override;
1414 int position()
const override {
return 0; }
1415 Tagged<WasmInstanceObject> wasm_instance()
const override;
1416 Tagged<WasmTrustedInstanceData> trusted_instance_data()
const override;
1419 inline explicit WasmToJsFrame(StackFrameIteratorBase* iterator);
1422 friend class StackFrameIteratorBase;
1425class WasmToJsFunctionFrame :
public TypedFrame {
1427 Type
type()
const override {
return WASM_TO_JS_FUNCTION; }
1430 inline explicit WasmToJsFunctionFrame(StackFrameIteratorBase* iterator);
1433 friend class StackFrameIteratorBase;
1436class JsToWasmFrame :
public StubFrame {
1438 Type
type()
const override {
return JS_TO_WASM; }
1440 void Iterate(RootVisitor* v)
const override;
1443 inline explicit JsToWasmFrame(StackFrameIteratorBase* iterator);
1446 friend class StackFrameIteratorBase;
1449class StackSwitchFrame :
public ExitFrame {
1451 Type
type()
const override {
return STACK_SWITCH; }
1452 void Iterate(RootVisitor* v)
const override;
1453 static void GetStateForJumpBuffer(wasm::JumpBuffer* jmpbuf, State* state);
1456 inline explicit StackSwitchFrame(StackFrameIteratorBase* iterator);
1459 friend class StackFrameIteratorBase;
1462class CWasmEntryFrame :
public StubFrame {
1464 Type
type()
const override {
return C_WASM_ENTRY; }
1466#if V8_ENABLE_DRUMBRAKE
1467 void Iterate(RootVisitor* v)
const override;
1471 inline explicit CWasmEntryFrame(StackFrameIteratorBase* iterator);
1474 friend class StackFrameIteratorBase;
1475 Type GetCallerState(State* state)
const override;
1478class WasmLiftoffSetupFrame :
public TypedFrame {
1480 Type
type()
const override {
return WASM_LIFTOFF_SETUP; }
1482 FullObjectSlot wasm_instance_data_slot()
const;
1484 int GetDeclaredFunctionIndex()
const;
1486 wasm::NativeModule* GetNativeModule()
const;
1489 void Iterate(RootVisitor* v)
const override;
1491 static WasmLiftoffSetupFrame*
cast(StackFrame* frame) {
1492 DCHECK(frame->is_wasm_liftoff_setup());
1493 return static_cast<WasmLiftoffSetupFrame*
>(frame);
1497 inline explicit WasmLiftoffSetupFrame(StackFrameIteratorBase* iterator);
1500 friend class StackFrameIteratorBase;
1563 Type type()
const override {
return BUILTIN_CONTINUATION; }
1579 Type type()
const override {
return JAVASCRIPT_BUILTIN_CONTINUATION; }
1604 return JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH;
1653#if V8_ENABLE_WEBASSEMBLY
1663 virtual bool IsStackFrameIteratorForProfiler()
const = 0;
1675#define DECLARE_SINGLETON(ignore, type) type type##_;
1677#undef DECLARE_SINGLETON
1681#if V8_ENABLE_WEBASSEMBLY
1683 bool first_stack_only_ =
false;
1708#if V8_ENABLE_WEBASSEMBLY
1715 struct FirstStackOnly {};
1733#if V8_ENABLE_WEBASSEMBLY
1739 bool IsStackFrameIteratorForProfiler()
const override {
return false; }
1742 StackFrame::State* state)
const override;
1746 void Reset(ThreadLocalTop* top);
1782 bool done()
const {
return iterator_.done(); }
1784 int FrameFunctionCount()
const;
1789 inline bool is_javascript()
const;
1790#if V8_ENABLE_WEBASSEMBLY
1791 inline bool is_wasm()
const;
1792#if V8_ENABLE_DRUMBRAKE
1793 inline bool is_wasm_interpreter_entry()
const;
1826 bool IsStackFrameIteratorForProfiler()
const override {
return true; }
1829 StackFrame::State* state)
const override;
1859#if V8_ENABLE_WEBASSEMBLY
1860 std::vector<std::unique_ptr<wasm::StackMemory>>& wasm_stacks_;
1872 Address fp, Address sp, Address lr,
1873 Address js_entry_sp);
1909 int translation_height,
bool is_topmost,
1910 bool pad_arguments) {
1911 return {parameters_count_with_receiver, translation_height, is_topmost,
1917 return {parameters_count_with_receiver, locals_count,
false,
true,
1933 int translation_height,
bool is_topmost,
1995 int translation_height,
1999 return {translation_height,
2000 continuation_descriptor,
2009 int parameters_count,
2014 return {parameters_count,
2015 continuation_descriptor,
2037 int translation_height,
static ApiAccessorExitFrame * cast(StackFrame *frame)
FullObjectSlot receiver_slot() const
FullObjectSlot property_name_slot() const
FrameSummaries Summarize() const override
FullObjectSlot holder_slot() const
Tagged< Object > receiver() const
ApiAccessorExitFrame(StackFrameIteratorBase *iterator)
Type type() const override
Tagged< Object > holder() const
void Print(StringStream *accumulator, PrintMode mode, int index) const override
Tagged< Name > property_name() const
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
static ApiCallbackExitFrame * cast(StackFrame *frame)
ApiCallbackExitFrame(StackFrameIteratorBase *iterator)
Tagged< Object > GetParameter(int i) const
DirectHandle< FixedArray > GetParameters() const
bool IsConstructor() const
Tagged< Object > receiver() const
int ComputeParametersCount() const
Type type() const override
int GetBytecodeOffset() const override
Type type() const override
static const BaselineFrame * cast(const StackFrame *frame)
void PatchContext(Tagged< Context > value)
BaselineFrame(StackFrameIteratorBase *iterator)
intptr_t GetPCForBytecodeOffset(int lookup_offset) const
static BaselineFrame * cast(StackFrame *frame)
uint32_t frame_size_in_bytes_above_fp_
uint32_t stack_parameter_count_
uint32_t frame_size_in_bytes_above_fp() const
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)
bool frame_has_result_stack_slot() const
uint32_t frame_size_in_bytes() const
uint32_t translated_stack_parameter_count_
bool frame_has_result_stack_slot_
uint32_t frame_size_in_bytes_
uint32_t translated_stack_parameter_count() const
static BuiltinContinuationFrameInfo Conservative(int parameters_count, const CallInterfaceDescriptor &continuation_descriptor, const RegisterConfiguration *register_config)
static BuiltinContinuationFrameInfo Precise(int translation_height, const CallInterfaceDescriptor &continuation_descriptor, const RegisterConfiguration *register_config, bool is_topmost, DeoptimizeKind deopt_kind, BuiltinContinuationMode continuation_mode)
uint32_t stack_parameter_count() const
BuiltinContinuationFrame(StackFrameIteratorBase *iterator)
Type type() const override
static BuiltinContinuationFrame * cast(StackFrame *frame)
bool IsConstructor() const
Tagged< Object > argc_slot_object() const
Tagged< Object > new_target_slot_object() const
Type type() const override
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
BuiltinExitFrame(StackFrameIteratorBase *iterator)
Tagged< Object > target_slot_object() const
FrameSummaries Summarize() const override
Tagged< Object > receiver() const
static BuiltinFrame * cast(StackFrame *frame)
int ComputeParametersCount() const override
BuiltinFrame(StackFrameIteratorBase *iterator)
Tagged< JSFunction > function() const override
virtual int ComputeParametersCount() const
Address GetParameterSlot(int index) const
CommonFrameWithJSLinkage(StackFrameIteratorBase *iterator)
FrameSummaries Summarize() const override
virtual int GetActualArgumentCount() const
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
CommonFrame(StackFrameIteratorBase *iterator)
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 SetExpression(int index, Tagged< Object > value)
void IterateTurbofanJSOptimizedFrame(RootVisitor *v) const
virtual int position() const
Address caller_pc() const
Tagged< Object > GetExpression(int index) const
void IterateExpressions(RootVisitor *v) const
virtual FrameSummaries Summarize() const
static CommonFrame * cast(StackFrame *frame)
virtual Address GetExpressionAddress(int n) const
Type type() const override
static ConstructEntryFrame * cast(StackFrame *frame)
Tagged< HeapObject > unchecked_code() const override
ConstructEntryFrame(StackFrameIteratorBase *iterator)
Type type() const override
static ConstructFrame * cast(StackFrame *frame)
ConstructFrame(StackFrameIteratorBase *iterator)
void Iterate(RootVisitor *v) const override
uint32_t frame_size_in_bytes_
uint32_t frame_size_in_bytes() const
static ConstructStubFrameInfo Conservative(int parameters_count)
static ConstructStubFrameInfo Precise(int translation_height, bool is_topmost)
uint32_t frame_size_in_bytes_without_fixed() const
uint32_t frame_size_in_bytes_without_fixed_
ConstructStubFrameInfo(int translation_height, bool is_topmost, FrameInfoKind frame_info_kind)
StackFrameIterator iterator_
Type type() const override
Tagged< HeapObject > unchecked_code() const override
Type GetCallerState(State *state) const override
EntryFrame(StackFrameIteratorBase *iterator)
Address GetCallerStackPointer() const override
static EntryFrame * cast(StackFrame *frame)
void Iterate(RootVisitor *v) const override
void ComputeCallerState(State *state) const override
ExitFrame(StackFrameIteratorBase *iterator)
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 ExitFrame * cast(StackFrame *frame)
static Type GetStateForFramePointer(Address fp, State *state)
FastConstructFrame(StackFrameIteratorBase *iterator)
Type type() const override
static FastConstructFrame * cast(StackFrame *frame)
uint32_t frame_size_in_bytes() const
uint32_t frame_size_in_bytes_without_fixed() const
uint32_t frame_size_in_bytes_
uint32_t frame_size_in_bytes_without_fixed_
static FastConstructStubFrameInfo Conservative()
FastConstructStubFrameInfo(bool is_topmost)
static FastConstructStubFrameInfo Precise(bool is_topmost)
Isolate * isolate() const
FrameSummaryBase(Isolate *isolate, Kind kind)
Handle< Object > receiver() const
Handle< FixedArray > parameters_
bool is_constructor() const
Handle< JSFunction > function_
Handle< JSFunction > function() const
Handle< AbstractCode > abstract_code_
Handle< Object > receiver_
Handle< AbstractCode > abstract_code() const
DirectHandle< FixedArray > parameters() const
bool is_subject_to_debugging() const
DirectHandle< Context > native_context() const
int SourceStatementPosition() const
bool is_constructor() const
Handle< Object > script() const
DirectHandle< StackFrameInfo > CreateStackFrameInfo() const
Handle< Object > receiver() const
int SourcePosition() const
static InternalFrame * cast(StackFrame *frame)
Type type() const override
InternalFrame(StackFrameIteratorBase *iterator)
void Iterate(RootVisitor *v) const override
static InterpretedFrame * cast(StackFrame *frame)
void PatchBytecodeOffset(int new_offset)
Type type() const override
void PatchBytecodeArray(Tagged< BytecodeArray > bytecode_array)
InterpretedFrame(StackFrameIteratorBase *iterator)
static const InterpretedFrame * cast(const StackFrame *frame)
int GetBytecodeOffset() const override
IrregexpFrame(StackFrameIteratorBase *iterator)
static IrregexpFrame * cast(StackFrame *frame)
void Iterate(RootVisitor *v) const override
Type type() const override
Type type() const override
Tagged< JSFunction > function() const override
Tagged< Object > context() const override
JavaScriptBuiltinContinuationFrame(StackFrameIteratorBase *iterator)
static JavaScriptBuiltinContinuationFrame * cast(StackFrame *frame)
intptr_t GetSPToFPDelta() const
int ComputeParametersCount() const override
void SetException(Tagged< Object > exception)
JavaScriptBuiltinContinuationWithCatchFrame(StackFrameIteratorBase *iterator)
static JavaScriptBuiltinContinuationWithCatchFrame * cast(StackFrame *frame)
Type type() const override
bool IsConstructor() const override
Type type() const override=0
Address GetCallerStackPointer() const override
Tagged< JSFunction > function() const override
void Print(StringStream *accumulator, PrintMode mode, int index) const override
static Register fp_register()
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
JavaScriptFrame(StackFrameIteratorBase *iterator)
virtual void PrintFrameKind(StringStream *accumulator) const
void set_receiver(Tagged< Object > value)
bool is_unoptimized() const
Tagged< Script > script() const
static Register constant_pool_pointer_register()
bool is_optimized() const
std::tuple< Tagged< AbstractCode >, int > GetActiveCodeAndOffset() const
static Register context_register()
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
static JavaScriptFrame * cast(StackFrame *frame)
JavaScriptFrame * Reframe()
JavaScriptStackFrameIterator(Isolate *isolate)
JavaScriptFrame * frame() const
V8_EXPORT_PRIVATE void Advance()
StackFrameIterator iterator_
JavaScriptStackFrameIterator(Isolate *isolate, ThreadLocalTop *top)
BytecodeOffset GetBytecodeOffsetForOSR() const
Type type() const override
DirectHandle< JSFunction > GetInnermostFunction() const
static MaglevFrame * cast(StackFrame *frame)
int FindReturnPCForTrampoline(Tagged< Code > code, int trampoline_pc) const override
void Iterate(RootVisitor *v) const override
MaglevFrame(StackFrameIteratorBase *iterator)
static intptr_t StackGuardFrameSize(int register_input_count)
Type type() const override
void Iterate(RootVisitor *v) const override
void ComputeCallerState(State *state) const override
NativeFrame(StackFrameIteratorBase *iterator)
FrameSummaries Summarize() const override
void GetFunctions(std::vector< Tagged< SharedFunctionInfo > > *functions) const override
OptimizedJSFrame(StackFrameIteratorBase *iterator)
virtual int FindReturnPCForTrampoline(Tagged< Code > code, int trampoline_pc) const =0
int LookupExceptionHandlerInTable(int *data, HandlerTable::CatchPrediction *prediction) override
static int StackSlotOffsetRelativeToFp(int slot_index)
Tagged< DeoptimizationData > GetDeoptimizationData(Tagged< Code > code, int *deopt_index) const
Isolate * isolate() const
StackFrameIteratorBase(const StackFrameIteratorBase &)=delete
void SetNewFrame(StackFrame::Type type, StackFrame::State *state)
StackFrameIteratorBase & operator=(const StackFrameIteratorBase &)=delete
StackHandler * handler() const
virtual StackFrame::Type ComputeStackFrameType(StackFrame::State *state) const =0
bool IsValidStackAddress(Address addr) const
StackFrame::Type GetCallerIfValid(StackFrame *frame, StackFrame::State *state)
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
const Address high_bound_
StackFrame::Type ComputeStackFrameType(StackFrame::State *state) const override
ExternalCallbackScope * external_callback_scope_
StackFrame::Type top_frame_type() const
Address top_link_register_
StackFrame * frame() const
static bool IsValidFrameType(StackFrame::Type type)
V8_EXPORT_PRIVATE void Advance()
StackFrameIterator(const StackFrameIterator &)=delete
StackFrame * frame() const
void Reset(ThreadLocalTop *top)
StackFrameIterator & operator=(const StackFrameIterator &)=delete
V8_EXPORT_PRIVATE StackFrameIterator(Isolate *isolate)
StackFrame::Type ComputeStackFrameType(StackFrame::State *state) const override
static constexpr int32_t TypeToMarker(Type type)
V8_EXPORT_PRIVATE Tagged< GcSafeCode > GcSafeLookupCode() const
Address unauthenticated_pc() const
bool is_stack_exit_frame() const
static const intptr_t kIsolateTag
bool is_builtin_exit() const
V8_EXPORT_PRIVATE Tagged< Code > LookupCode() const
static ReturnAddressLocationResolver return_address_location_resolver_
bool is_builtin_continuation() const
V8_EXPORT_PRIVATE std::pair< Tagged< Code >, int > LookupCodeAndOffset() const
Address caller_sp() const
bool is_profiler_entry_frame() const
static constexpr bool IsTypeMarker(uintptr_t function_or_marker)
static Address maybe_unauthenticated_pc(Address *pc_address)
Address callee_fp() const
static bool IsJavaScript(Type t)
static constexpr Type MarkerToType(intptr_t marker)
Address constant_pool() const
virtual Type type() const =0
bool is_javascript() const
bool is_construct() const
virtual Address GetCallerStackPointer() const =0
virtual void ComputeCallerState(State *state) const =0
Address * pc_address() const
Isolate * isolate() const
static Address * ResolveReturnAddressLocation(Address *pc_address)
StackHandler * top_handler() const
bool is_api_callback_exit() const
void set_constant_pool(Address constant_pool)
virtual void Iterate(RootVisitor *v) const =0
bool is_unoptimized_js() const
Address callee_pc() const
const StackFrameIteratorBase *const iterator_
virtual Type GetCallerState(State *state) const
bool is_javascript_builtin_with_catch_continuation() const
Address * constant_pool_address() const
bool is_construct_entry() const
V8_EXPORT_PRIVATE std::pair< Tagged< GcSafeCode >, int > GcSafeLookupCodeAndOffset() const
bool is_javascript_builtin_continuation() const
static void SetReturnAddressLocationResolver(ReturnAddressLocationResolver resolver)
bool is_interpreted() const
virtual void Print(StringStream *accumulator, PrintMode mode, int index) const
bool is_turbofan_js() const
virtual Tagged< HeapObject > unchecked_code() const =0
@ OUTERMOST_JSENTRY_FRAME
StackFrame(const StackFrame &original) V8_NOEXCEPT
bool is_optimized_js() const
Address maybe_unauthenticated_pc() const
bool is_fast_construct() const
bool is_api_accessor_exit() const
void operator=(const StackFrame &original)=delete
void IteratePc(RootVisitor *v, Address *constant_pool_address, Tagged< GcSafeCode > holder) const
static Address ReadPC(Address *pc_address)
static const int kPaddingOffset
static const int kNextOffset
static const int kSlotCount
static StackHandler * FromAddress(Address address)
DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler)
StackHandler * next() const
Address next_address() const
Tagged< HeapObject > unchecked_code() const override
FrameSummaries Summarize() const override
int LookupExceptionHandlerInTable()
Type type() const override
StubFrame(StackFrameIteratorBase *iterator)
int FindReturnPCForTrampoline(Tagged< Code > code, int trampoline_pc) const override
TurbofanJSFrame(StackFrameIteratorBase *iterator)
void Iterate(RootVisitor *v) const override
Tagged< Object > StackSlotAt(int index) const
Type type() const override
int ComputeParametersCount() const override
Type type() const override
Tagged< HeapObject > unchecked_code() const override
void Iterate(RootVisitor *v) const override
TurbofanStubWithContextFrame(StackFrameIteratorBase *iterator)
void Iterate(RootVisitor *v) const override
TypedFrameWithJSLinkage(StackFrameIteratorBase *iterator)
void IterateParamsOfGenericWasmToJSWrapper(RootVisitor *v) const
Tagged< HeapObject > unchecked_code() const override
TypedFrame(StackFrameIteratorBase *iterator)
void Iterate(RootVisitor *v) const override
void IterateParamsOfOptimizedWasmToJSWrapper(RootVisitor *v) const
uint32_t register_stack_slot_count() const
static uint32_t GetStackSizeForAdditionalArguments(int parameters_count)
static UnoptimizedFrameInfo Precise(int parameters_count_with_receiver, int translation_height, bool is_topmost, bool pad_arguments)
UnoptimizedFrameInfo(int parameters_count_with_receiver, int translation_height, bool is_topmost, bool pad_arguments, FrameInfoKind frame_info_kind)
uint32_t frame_size_in_bytes_without_fixed_
uint32_t frame_size_in_bytes() const
static UnoptimizedFrameInfo Conservative(int parameters_count_with_receiver, int locals_count)
uint32_t frame_size_in_bytes_
uint32_t frame_size_in_bytes_without_fixed() const
uint32_t register_stack_slot_count_
UnoptimizedJSFrame(StackFrameIteratorBase *iterator)
Address GetExpressionAddress(int n) const override
void SetFeedbackVector(Tagged< FeedbackVector > feedback_vector)
static UnoptimizedJSFrame * cast(StackFrame *frame)
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
virtual int GetBytecodeOffset() const =0
const JSFunctionRef function_
#define DECLARE_TYPE(type, value)
#define CONSTRUCT_ENTRY(NAME, LOWER_NAME)
ZoneList< RegExpInstruction > code_
#define FRAME_SUMMARY_VARIANTS(F)
#define DECLARE_SINGLETON(ignore, type)
#define FRAME_SUMMARY_CONS(kind, type, field, desc)
#define FRAME_SUMMARY_FIELD(kind, type, field, desc)
#define FRAME_SUMMARY_CAST(kind_, type, field, desc)
#define FRAME_SUMMARY_KIND(kind, type, field, desc)
#define STACK_FRAME_TYPE_LIST(V)
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
const intptr_t kHeapObjectTagMask
constexpr int kNoSourcePosition
kWasmInternalFunctionIndirectPointerTag instance_data
@ JAVASCRIPT_HANDLE_EXCEPTION
constexpr int kSystemPointerSizeLog2
constexpr int kSystemPointerSize
const intptr_t kSmiTagMask
static constexpr Address kNullAddress
!IsContextMap !IsContextMap native_context
uintptr_t(*)(uintptr_t return_addr_location) ReturnAddressLocationResolver
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
std::vector< FrameSummary > frames
FrameSummaries(FrameSummary summary)
bool top_frame_is_construct_call
bool is_profiler_entry_frame
Address * constant_pool_address