5#ifndef V8_BUILTINS_BUILTINS_H_
6#define V8_BUILTINS_BUILTINS_H_
15#ifdef V8_ENABLE_WEBASSEMBLY
23class CallInterfaceDescriptor;
45#define BUILTIN_CODE(isolate, name) \
46 (isolate)->builtins()->code_handle(i::Builtin::k##name)
50#define DEF_ENUM(Name, ...) k##Name,
54#define EXTRACT_NAME(Name, ...) k##Name,
56 kFirstBytecodeHandler =
61#define DEF_ENUM(Name, ...) k##Name = static_cast<int32_t>(Builtin::k##Name),
66#define CASE(Name, ...) \
67 if (builtin == TieringBuiltin::k##Name) { \
76 using type =
typename std::underlying_type<Builtin>::type;
77 return static_cast<type
>(
a) <
static_cast<type
>(b);
81 using type =
typename std::underlying_type<Builtin>::type;
82 return builtin =
static_cast<Builtin>(
static_cast<type
>(
builtin) + 1);
97#if !defined(V8_SHORT_BUILTIN_CALLS) || defined(V8_COMPRESS_POINTERS)
104#define ADD_ONE(Name, ...) +1
118 static_cast<int>(Builtin::kFirstBytecodeHandler) +
119 kNumberOfBytecodeHandlers;
133 return static_cast<uint32_t
>(maybe_id) <
142 return static_cast<Builtin>(id);
146 return static_cast<int>(id);
164 int formal_parameter_count);
186 bool builtin_exit_frame =
false,
187 bool switch_to_central_stack =
false);
190 int result_size,
bool switch_to_central_stack =
false);
224 Builtin builtin,
int function_length,
225 int formal_parameter_count_with_receiver);
298 ArgvMode argv_mode,
bool builtin_exit_frame,
299 bool switch_to_central_stack);
334#if V8_ENABLE_DRUMBRAKE
335 int cwasm_interpreter_entry_handler_offset()
const {
336 DCHECK_NE(cwasm_interpreter_entry_handler_offset_, 0);
337 return cwasm_interpreter_entry_handler_offset_;
340 void SetCWasmInterpreterEntryHandlerOffset(
int offset) {
344 CHECK(cwasm_interpreter_entry_handler_offset_ == 0 ||
345 cwasm_interpreter_entry_handler_offset_ ==
offset);
346 cwasm_interpreter_entry_handler_offset_ =
offset;
374 bool save_new_target);
401#define DECLARE_ASM(Name, ...) \
402 static void Generate_##Name(MacroAssembler* masm);
403#define DECLARE_TF(Name, ...) \
404 static void Generate_##Name(compiler::CodeAssemblerState* state);
405#define DECLARE_TS(Name, ...) \
406 static void Generate_##Name(compiler::turboshaft::PipelineData* data, \
408 compiler::turboshaft::Graph& graph, Zone* zone);
424#if V8_ENABLE_DRUMBRAKE
428 int cwasm_interpreter_entry_handler_offset_ = 0;
442 (builtin_id == Builtin::kInterpreterEntryTrampoline ||
443 builtin_id == Builtin::kInterpreterEnterAtBytecode ||
444 builtin_id == Builtin::kInterpreterEnterAtNextBytecode);
451 (builtin_id == Builtin::kBaselineOutOfLinePrologue ||
452 builtin_id == Builtin::kBaselineOutOfLinePrologueDeopt);
456 size_t function_pointer_type_id);
462#if defined(V8_USE_LIBM_TRIG_FUNCTIONS)
464 v8_flags.use_libm_trig_functions ? base::ieee754::libm_sin(X) \
465 : base::ieee754::fdlibm_sin(X)
467 v8_flags.use_libm_trig_functions ? base::ieee754::libm_cos(X) \
468 : base::ieee754::fdlibm_cos(X)
470#define SIN_IMPL(X) base::ieee754::sin(X)
471#define COS_IMPL(X) base::ieee754::cos(X)
#define BUILTIN_LIST_TIER0(CPP, TFJ, TFC, TFS, TFH, BCH, ASM)
#define BUILTIN_LIST_BASE_TIERING(TFC)
#define IGNORE_BUILTIN(...)
#define DECLARE_TS(Name,...)
#define EXTRACT_NAME(Name,...)
#define DECLARE_ASM(Name,...)
#define ADD_ONE(Name,...)
#define DECLARE_TF(Name,...)
void SetJSEntryHandlerOffset(int offset)
static constexpr Builtin InterpreterPushArgsThenCall(ConvertReceiverMode receiver_mode, InterpreterPushArgsMode mode)
static bool AllowDynamicFunction(Isolate *isolate, DirectHandle< JSFunction > target, DirectHandle< JSObject > target_global_proxy)
static constexpr Builtin RecordWrite(SaveFPRegsMode fp_mode)
static V8_EXPORT_PRIVATE bool IsCpp(Builtin builtin)
int js_entry_handler_offset_
static bool IsIsolateIndependentBuiltin(Tagged< Code > code)
static constexpr Builtin InterpreterPushArgsThenConstruct(InterpreterPushArgsMode mode)
static V8_EXPORT_PRIVATE Kind KindOf(Builtin builtin)
static void Generate_InterpreterPushArgsThenConstructImpl(MacroAssembler *masm, InterpreterPushArgsMode mode)
bool is_initialized() const
static void Generate_CallOrConstructForwardVarargs(MacroAssembler *masm, CallOrConstructMode mode, Builtin target_builtin)
static constexpr bool IsJSEntryVariant(Builtin builtin)
V8_EXPORT_PRIVATE Handle< Code > code_handle(Builtin builtin)
static constexpr Builtin OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint)
static BytecodeOffset GetContinuationBytecodeOffset(Builtin builtin)
static CallInterfaceDescriptor CallInterfaceDescriptorFor(Builtin builtin)
static constexpr bool kBytecodeHandlersAreSortedLast
static constexpr int kBuiltinCount
static constexpr int kLastBytecodeHandlerPlusOne
static Address CppEntryOf(Builtin builtin)
const char * Lookup(Address pc)
static constexpr Builtin kFirst
static int GetFormalParameterCount(Builtin builtin)
static V8_EXPORT_PRIVATE int GetStackParameterCount(Builtin builtin)
static void Generate_InterpreterEntryTrampoline(MacroAssembler *masm, InterpreterEntryTrampolineMode mode)
static constexpr Builtin RuntimeCEntry(int result_size, bool switch_to_central_stack=false)
static Builtin GetBuiltinFromBytecodeOffset(BytecodeOffset)
static constexpr Builtin EphemeronKeyBarrier(SaveFPRegsMode fp_mode)
FullObjectSlot builtin_slot(Builtin builtin)
InterpreterEntryTrampolineMode
static void Generate_Adaptor(MacroAssembler *masm, int formal_parameter_count, Address builtin_address)
static void Generate_CEntry(MacroAssembler *masm, int result_size, ArgvMode argv_mode, bool builtin_exit_frame, bool switch_to_central_stack)
static constexpr Builtin CallFunction(ConvertReceiverMode=ConvertReceiverMode::kAny)
static constexpr Builtin AdaptorWithBuiltinExitFrame(int formal_parameter_count)
FullObjectSlot builtin_tier0_slot(Builtin builtin)
static V8_EXPORT_PRIVATE CodeEntrypointTag EntrypointTagFor(Builtin builtin)
static void Generate_MaglevFunctionEntryStackCheck(MacroAssembler *masm, bool save_new_target)
static constexpr int kFirstWideBytecodeHandler
void SetJSPIPromptHandlerOffset(int offset)
static constexpr bool IsIsolateIndependent(Builtin builtin)
static constexpr int ToInt(Builtin id)
static void Generate_Call(MacroAssembler *masm, ConvertReceiverMode mode)
static const char * KindNameOf(Builtin builtin)
Builtins(const Builtins &)=delete
static constexpr Builtin LoadGlobalICInOptimizedCode(TypeofMode typeof_mode)
static V8_WARN_UNUSED_RESULT MaybeHandle< Object > InvokeApiFunction(Isolate *isolate, bool is_construct, DirectHandle< FunctionTemplateInfo > function, DirectHandle< Object > receiver, base::Vector< const DirectHandle< Object > > args, DirectHandle< HeapObject > new_target)
static void Generate_CallFunction(MacroAssembler *masm, ConvertReceiverMode mode)
static void InitializeIsolateDataTables(Isolate *isolate)
static constexpr bool AllBuiltinsAreIsolateIndependent()
static void EmitCodeCreateEvents(Isolate *isolate)
static constexpr int kBuiltinTier0Count
BUILTIN_LIST(IGNORE_BUILTIN, DECLARE_TS, DECLARE_TF, DECLARE_TS, DECLARE_TF, DECLARE_TF, DECLARE_TF, IGNORE_BUILTIN, DECLARE_ASM) Isolate *isolate_
static void Generate_CallOrConstructVarargs(MacroAssembler *masm, Builtin target_builtin)
static V8_EXPORT_PRIVATE const char * NameForStackTrace(Isolate *isolate, Builtin builtin)
static DirectHandle< Code > CreateInterpreterEntryTrampolineForProfiling(Isolate *isolate)
static constexpr Builtin IndirectPointerBarrier(SaveFPRegsMode fp_mode)
static constexpr bool kAllBuiltinsAreIsolateIndependent
Builtins(Isolate *isolate)
static void Generate_CallApiCallbackImpl(MacroAssembler *masm, CallApiCallbackMode mode)
void set_code(Builtin builtin, Tagged< Code > code)
static constexpr bool IsBuiltinId(Builtin builtin)
static constexpr Builtin FromInt(int id)
static constexpr bool IsTier0(Builtin builtin)
static V8_EXPORT_PRIVATE bool HasJSLinkage(Builtin builtin)
static constexpr Builtin Call(ConvertReceiverMode=ConvertReceiverMode::kAny)
static constexpr Builtin kLast
static void Generate_CallBoundFunctionImpl(MacroAssembler *masm)
static constexpr bool IsBuiltinId(int maybe_id)
static constexpr bool kCodeObjectsAreInROSpace
static constexpr Builtin NonPrimitiveToPrimitive(ToPrimitiveHint hint=ToPrimitiveHint::kDefault)
static constexpr int kFirstExtraWideBytecodeHandler
int jspi_prompt_handler_offset_
static void Generate_ConstructForwardAllArgsImpl(MacroAssembler *masm, ForwardWhichFrame which_frame)
bool IsBuiltinHandle(IndirectHandle< HeapObject > maybe_code, Builtin *index) const
static Address EntryOf(Builtin builtin, Isolate *isolate)
static constexpr Builtin StringAdd(StringAddFlags flags=STRING_ADD_CHECK_NONE)
static bool IsBuiltin(const Tagged< Code > code)
static constexpr Builtin InterpreterCEntry(int result_size)
Builtins & operator=(const Builtins &)=delete
static constexpr Builtin kLastTier0
int jspi_prompt_handler_offset() const
static bool CheckFormalParameterCount(Builtin builtin, int function_length, int formal_parameter_count_with_receiver)
static constexpr Builtin CEntry(int result_size, ArgvMode argv_mode, bool builtin_exit_frame=false, bool switch_to_central_stack=false)
static constexpr Builtin LoadGlobalIC(TypeofMode typeof_mode)
static void Generate_InterpreterPushArgsThenCallImpl(MacroAssembler *masm, ConvertReceiverMode receiver_mode, InterpreterPushArgsMode mode)
int js_entry_handler_offset() const
static constexpr bool IsAnyCall(Builtin builtin)
static V8_EXPORT_PRIVATE Callable CallableFor(Isolate *isolate, Builtin builtin)
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
std::optional< TNode< JSArray > > a
V8_INLINE constexpr bool IsInterpreterTrampolineBuiltin(Builtin builtin_id)
static constexpr T FirstFromVarArgs(T x,...) noexcept
V8_INLINE constexpr bool IsBaselineTrampolineBuiltin(Builtin builtin_id)
compiler::CodeAssemblerState CodeAssemblerState
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
V8_INLINE constexpr bool operator<(Builtin a, Builtin b)
V8_INLINE bool IsValidTieringBuiltin(TieringBuiltin builtin)
V8_INLINE Builtin operator++(Builtin &builtin)
Builtin ExampleBuiltinForTorqueFunctionPointerType(size_t function_pointer_type_id)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
#define V8_WARN_UNUSED_RESULT