5#ifndef V8_DEOPTIMIZER_DEOPTIMIZER_H_
6#define V8_DEOPTIMIZER_DEOPTIMIZER_H_
19#if V8_ENABLE_WEBASSEMBLY
33class DeoptimizedFrameInfo;
115 Isolate* isolate, DirectHandle<SharedFunctionInfo> function);
144#ifdef V8_ENABLE_CET_SHADOW_STACK
145 static constexpr int shadow_stack_offset() {
149 static constexpr int shadow_stack_count_offset() {
193#if V8_ENABLE_WEBASSEMBLY
194 void DoComputeOutputFramesWasmImpl();
198 std::stack<intptr_t>& shadow_stack);
201 int* parameter_stack_slots,
202 int* return_stack_slots);
206 int frame_index,
bool goto_catch_handler);
215 bool must_handle_result);
217#if V8_ENABLE_WEBASSEMBLY
219 std::optional<wasm::ValueKind> wasm_call_return_kind);
243 static void TraceFoundActivation(
Isolate* isolate,
253#if V8_ENABLE_WEBASSEMBLY
293#ifdef V8_ENABLE_CET_SHADOW_STACK
294 intptr_t* shadow_stack_ =
nullptr;
295 size_t shadow_stack_count_ = 0;
306#if V8_ENABLE_WEBASSEMBLY && V8_TARGET_ARCH_32_BIT
309 std::optional<AccountingAllocator> alloc_;
310 std::optional<Zone>
zone_;
312#if V8_ENABLE_WEBASSEMBLY && V8_ENABLE_SANDBOX
315 std::optional<SandboxHardwareSupport::BlockAccessScope>
316 no_heap_access_during_wasm_deopt_;
static constexpr BytecodeOffset None()
unsigned ComputeInputFrameSize() const
unsigned deopt_exit_index_
bool is_restart_frame() const
static Deoptimizer * Grab(Isolate *isolate)
static void PatchToJump(Address pc, Address new_pc)
static int caller_frame_top_offset()
intptr_t caller_constant_pool_
void DoComputeInlinedExtraArguments(TranslatedFrame *translated_frame, int frame_index)
static void DeoptimizeAllOptimizedCodeWithFunction(Isolate *isolate, DirectHandle< SharedFunctionInfo > function)
void DoComputeConstructInvokeStubFrame(TranslatedFrame *translated_frame, int frame_index)
void DoComputeUnoptimizedFrame(TranslatedFrame *translated_frame, int frame_index, bool goto_catch_handler)
DirectHandle< JSFunction > function() const
void QueueFeedbackVectorForMaterialization(Address output_address, const TranslatedFrame::iterator &iterator)
static int output_offset()
static void ComputeOutputFrames(Deoptimizer *deoptimizer)
std::vector< ValueToMaterialize > feedback_vector_to_materialize_
static V8_EXPORT_PRIVATE const int kEagerDeoptExitSize
static size_t DeleteForWasm(Isolate *isolate)
static void TraceDeoptAll(Isolate *isolate)
void TraceDeoptBegin(int optimization_id, BytecodeOffset bytecode_offset)
DirectHandle< Code > compiled_code() const
Tagged< Code > compiled_code_
static int input_offset()
static V8_EXPORT_PRIVATE const int kAdaptShadowStackOffsetToSubtract
bool tracing_enabled() const
static void DeoptimizeFunction(Tagged< JSFunction > function, LazyDeoptimizeReason reason, Tagged< Code > code={})
void TraceDeoptEnd(double deopt_duration)
static DeoptimizedFrameInfo * DebuggerInspectableFrame(JavaScriptFrame *frame, int jsframe_index, Isolate *isolate)
static Address EnsureValidReturnAddress(Isolate *isolate, Address address)
static bool DeoptExitIsInsideOsrLoop(Isolate *isolate, Tagged< JSFunction > function, BytecodeOffset deopt_exit_offset, BytecodeOffset osr_offset)
void DoComputeOutputFrames()
static V8_EXPORT_PRIVATE void DeoptimizeAll(Isolate *isolate)
unsigned ComputeInputFrameAboveFpFixedSize() const
static int output_count_offset()
static void DeoptimizeMarkedCode(Isolate *isolate)
static Builtin TrampolineForBuiltinContinuation(BuiltinContinuationMode mode, bool must_handle_result)
static Deoptimizer * New(Address raw_function, DeoptimizeKind kind, Address from, int fp_to_sp_delta, Isolate *isolate)
CodeTracer::Scope * verbose_trace_scope() const
CodeTracer::Scope *const trace_scope_
static V8_EXPORT_PRIVATE Builtin GetDeoptimizationEntry(DeoptimizeKind kind)
void DeleteFrameDescriptions()
static unsigned ComputeIncomingArgumentSize(Tagged< Code > code)
static void TraceEvictFromOptimizedCodeCache(Isolate *isolate, Tagged< SharedFunctionInfo > sfi, const char *reason)
static constexpr unsigned kFixedExitSizeMarker
static constexpr int kMaxNumberOfEntries
static V8_EXPORT_PRIVATE const int kLazyDeoptExitSize
Isolate * isolate() const
TranslatedState translated_state_
int actual_argument_count_
void MaterializeHeapObjects()
static void TraceMarkForDeoptimization(Isolate *isolate, Tagged< Code > code, LazyDeoptimizeReason reason)
DeoptimizeKind deopt_kind_
CodeTracer::Scope * trace_scope() const
void DoComputeConstructCreateStubFrame(TranslatedFrame *translated_frame, int frame_index)
FrameDescription ** output_
int catch_handler_pc_offset_
DeoptimizeKind deopt_kind() const
FrameDescription * input_
bool verbose_tracing_enabled() const
BytecodeOffset bytecode_offset_in_outermost_frame_
void DoComputeBuiltinContinuation(TranslatedFrame *translated_frame, int frame_index, BuiltinContinuationMode mode)
Deoptimizer(Isolate *isolate, Tagged< JSFunction > function, DeoptimizeKind kind, Address from, int fp_to_sp_delta)
DeoptInfo GetDeoptInfo() const
void QueueValueForMaterialization(Address output_address, Tagged< Object > obj, const TranslatedFrame::iterator &iterator)
BytecodeOffset bytecode_offset_in_outermost_frame() const
std::vector< ValueToMaterialize > values_to_materialize_
static const char * MessageFor(DeoptimizeKind kind)
Tagged< JSFunction > function_
intptr_t caller_frame_top_
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr uint32_t kMaxUInt32
#define V8_EXPORT_PRIVATE
const SourcePosition position
const DeoptimizeReason deopt_reason
DeoptInfo(SourcePosition position, DeoptimizeReason deopt_reason, uint32_t node_id, int deopt_id)
Address output_slot_address_
TranslatedFrame::iterator value_