24#ifdef V8_JS_LINKAGE_INCLUDES_DISPATCH_HANDLE
25 auto dispatch_handle =
41#ifndef V8_ENABLE_LEAPTIERING
45 Label fallthrough(
this), may_have_optimized_code(
this),
46 maybe_needs_logging(
this);
52 constexpr uint32_t kFlagMask =
54 CodeKind::INTERPRETED_FUNCTION);
59 &maybe_needs_logging);
62 BIND(&maybe_needs_logging);
65 &may_have_optimized_code);
70 BIND(&may_have_optimized_code);
72 Label heal_optimized_code_slot(
this);
74 feedback_vector, FeedbackVector::kMaybeOptimizedCodeOffset);
78 maybe_optimized_code_entry, &heal_optimized_code_slot));
85 &heal_optimized_code_slot);
90 Comment(
"MaybeTailCallOptimizedCodeSlot:: GenerateTailCallToJSCode");
96 BIND(&heal_optimized_code_slot);
123 GotoIf(IsUndefined(feedback_cell_value), &compile_function);
128#ifndef V8_ENABLE_LEAPTIERING
134 Label maybe_use_sfi_code(
this);
137 &maybe_use_sfi_code);
140 CSA_DCHECK(
this, IsFeedbackVector(feedback_cell_value));
142#ifndef V8_ENABLE_LEAPTIERING
146 Goto(&maybe_use_sfi_code);
152 BIND(&maybe_use_sfi_code);
153#ifdef V8_ENABLE_LEAPTIERING
160 Label tailcall_code(
this), baseline(
this);
167 Goto(&tailcall_code);
172 IsFeedbackVector(feedback_cell_value), [=]() {
return sfi_code; },
178 Goto(&tailcall_code);
180 BIND(&tailcall_code);
184 BIND(&compile_function);
189 auto function = Parameter<JSFunction>(Descriptor::kTarget);
191 CompileLazy(function);
194#ifdef V8_ENABLE_LEAPTIERING
196template <
typename Function>
197void LazyBuiltinsAssembler::TieringBuiltinImpl(
const Function& Impl) {
203#ifdef V8_JS_LINKAGE_INCLUDES_DISPATCH_HANDLE
204 auto dispatch_handle =
209 function, JSFunction::kDispatchHandleOffset);
213 Impl(context, function);
219 function, JSFunction::kDispatchHandleOffset)));
226 TNode<Code> code = LoadCodeObjectFromJSDispatchTable(dispatch_handle);
230TF_BUILTIN(FunctionLogNextExecution, LazyBuiltinsAssembler) {
231 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
232 CallRuntime(Runtime::kFunctionLogNextExecution, context, function);
236TF_BUILTIN(StartMaglevOptimizeJob, LazyBuiltinsAssembler) {
237 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
238 CallRuntime(Runtime::kStartMaglevOptimizeJob, context, function);
242TF_BUILTIN(StartTurbofanOptimizeJob, LazyBuiltinsAssembler) {
243 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
244 CallRuntime(Runtime::kStartTurbofanOptimizeJob, context, function);
248TF_BUILTIN(OptimizeMaglevEager, LazyBuiltinsAssembler) {
249 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
250 CallRuntime(Runtime::kOptimizeMaglevEager, context, function);
254TF_BUILTIN(OptimizeTurbofanEager, LazyBuiltinsAssembler) {
255 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
256 CallRuntime(Runtime::kOptimizeTurbofanEager, context, function);
260TF_BUILTIN(MarkLazyDeoptimized, LazyBuiltinsAssembler) {
261 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
262 CallRuntime(Runtime::kMarkLazyDeoptimized, context, function,
267TF_BUILTIN(MarkReoptimizeLazyDeoptimized, LazyBuiltinsAssembler) {
268 TieringBuiltinImpl([&](TNode<Context> context, TNode<JSFunction> function) {
269 CallRuntime(Runtime::kMarkLazyDeoptimized, context, function,
277 auto function = Parameter<JSFunction>(Descriptor::kTarget);
281 StoreCodePointerField(function, JSFunction::kCodeOffset, code);
282 GenerateTailCallToJSCode(code, function);
#define CSA_DCHECK(csa,...)
#define TF_BUILTIN(Name, AssemblerBase)
#define BUILTIN_CODE(isolate, name)
TNode< MaybeObject > LoadMaybeWeakObjectField(TNode< HeapObject > object, int offset)
TNode< JSDispatchHandleT > InvalidDispatchHandleConstant()
TNode< BoolT > InstanceTypeEqual(TNode< Int32T > instance_type, int type)
void StoreCodePointerField(TNode< HeapObject > object, int offset, TNode< Code > value)
TNode< Code > LoadCodePointerFromObject(TNode< HeapObject > object, int offset)
TNode< T > LoadObjectField(TNode< HeapObject > object, int offset)
TNode< BoolT > TaggedNotEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< Code > GetSharedFunctionInfoCode(TNode< SharedFunctionInfo > shared_info, TVariable< Uint16T > *data_type_out=nullptr, Label *if_compile_lazy=nullptr)
TNode< BoolT > IsSetWord32(TNode< Word32T > word32)
TNode< HeapObject > LoadFeedbackCellValue(TNode< JSFunction > closure)
TNode< BoolT > HasInstanceType(TNode< HeapObject > object, InstanceType type)
TNode< T > Select(TNode< BoolT > condition, const NodeGenerator< T > &true_body, const NodeGenerator< T > &false_body, BranchHint branch_hint=BranchHint::kNone)
TNode< BoolT > IsMarkedForDeoptimization(TNode< Code > code)
TNode< HeapObject > GetHeapObjectAssumeWeak(TNode< MaybeObject > value)
static constexpr uint32_t kFlagsTieringStateIsAnyRequested
static constexpr uint32_t kFlagsLogNextExecution
static constexpr uint32_t FlagMaskForNeedsProcessingCheckFrom(CodeKind code_kind)
void GenerateTailCallToJSCode(TNode< Code > code, TNode< JSFunction > function)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id, TNode< JSFunction > function)
void CompileLazy(TNode< JSFunction > function)
void MaybeTailCallOptimizedCodeSlot(TNode< JSFunction > function, TNode< FeedbackVector > feedback_vector)
void Comment(MessageWithSourceLocation message, Args &&... args)
void GotoIfNot(TNode< IntegralT > condition, Label *false_label, GotoHint goto_hint=GotoHint::kNone)
Isolate * isolate() const
void GotoIf(TNode< IntegralT > condition, Label *true_label, GotoHint goto_hint=GotoHint::kNone)
TNode< T > UncheckedParameter(int value)
void TailCallJSCode(TNode< Code > code, TNode< Context > context, TNode< JSFunction > function, TNode< Object > new_target, TNode< Int32T > arg_count, TNode< JSDispatchHandleT > dispatch_handle)
TNode< Type > HeapConstantNoHole(Handle< Type > object)
TNode< BoolT > Word32Equal(TNode< Word32T > left, TNode< Word32T > right)
TNode< T > CallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
TNode< T > Parameter(int value, const SourceLocation &loc=SourceLocation::Current())
#define V8_ENABLE_SANDBOX_BOOL
DirectHandle< Object > new_target