v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
builtins-inl.h
Go to the documentation of this file.
1// Copyright 2023 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_BUILTINS_BUILTINS_INL_H_
6#define V8_BUILTINS_BUILTINS_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
12
13namespace v8 {
14namespace internal {
15
16// static
18 switch (fp_mode) {
20 return Builtin::kRecordWriteIgnoreFP;
22 return Builtin::kRecordWriteSaveFP;
23 }
24}
25
26// static
28 switch (fp_mode) {
30 return Builtin::kIndirectPointerBarrierIgnoreFP;
32 return Builtin::kIndirectPointerBarrierSaveFP;
33 }
34}
35
36// static
38 switch (fp_mode) {
40 return Builtin::kEphemeronKeyBarrierIgnoreFP;
42 return Builtin::kEphemeronKeyBarrierSaveFP;
43 }
44}
45
46// static
48 int formal_parameter_count) {
49 switch (formal_parameter_count) {
51 case JSParameterCount(0):
52 return Builtin::kAdaptorWithBuiltinExitFrame0;
53 case JSParameterCount(1):
54 return Builtin::kAdaptorWithBuiltinExitFrame1;
55 case JSParameterCount(2):
56 return Builtin::kAdaptorWithBuiltinExitFrame2;
57 case JSParameterCount(3):
58 return Builtin::kAdaptorWithBuiltinExitFrame3;
59 case JSParameterCount(4):
60 return Builtin::kAdaptorWithBuiltinExitFrame4;
61 case JSParameterCount(5):
62 return Builtin::kAdaptorWithBuiltinExitFrame5;
63 }
65}
66
67// static
69 switch (mode) {
71 return Builtin::kCallFunction_ReceiverIsNullOrUndefined;
73 return Builtin::kCallFunction_ReceiverIsNotNullOrUndefined;
75 return Builtin::kCallFunction_ReceiverIsAny;
76 }
78}
79
80// static
82 switch (mode) {
84 return Builtin::kCall_ReceiverIsNullOrUndefined;
86 return Builtin::kCall_ReceiverIsNotNullOrUndefined;
88 return Builtin::kCall_ReceiverIsAny;
89 }
91}
92
93// static
94constexpr bool Builtins::IsAnyCall(Builtin builtin) {
95 switch (builtin) {
96 case Builtin::kCallFunction_ReceiverIsNullOrUndefined:
97 case Builtin::kCallFunction_ReceiverIsNotNullOrUndefined:
98 case Builtin::kCallFunction_ReceiverIsAny:
99 case Builtin::kCall_ReceiverIsNullOrUndefined:
100 case Builtin::kCall_ReceiverIsNotNullOrUndefined:
101 case Builtin::kCall_ReceiverIsAny:
102 return true;
103 default:
104 return false;
105 }
106}
107
108// static
110 switch (hint) {
112 return Builtin::kNonPrimitiveToPrimitive_Default;
114 return Builtin::kNonPrimitiveToPrimitive_Number;
116 return Builtin::kNonPrimitiveToPrimitive_String;
117 }
118 UNREACHABLE();
119}
120
121// static
123 switch (hint) {
125 return Builtin::kOrdinaryToPrimitive_Number;
127 return Builtin::kOrdinaryToPrimitive_String;
128 }
129 UNREACHABLE();
130}
131
132// static
134 switch (flags) {
136 return Builtin::kStringAdd_CheckNone;
138 return Builtin::kStringAddConvertLeft;
140 return Builtin::kStringAddConvertRight;
141 }
142 UNREACHABLE();
143}
144
145// static
147 return typeof_mode == TypeofMode::kNotInside
148 ? Builtin::kLoadGlobalICTrampoline
149 : Builtin::kLoadGlobalICInsideTypeofTrampoline;
150}
151
152// static
154 TypeofMode typeof_mode) {
155 return typeof_mode == TypeofMode::kNotInside
156 ? Builtin::kLoadGlobalIC
157 : Builtin::kLoadGlobalICInsideTypeof;
158}
159
160// static
161constexpr Builtin Builtins::CEntry(int result_size, ArgvMode argv_mode,
162 bool builtin_exit_frame,
163 bool switch_to_central_stack) {
164 // Aliases for readability below.
165 const int rs = result_size;
166 const ArgvMode am = argv_mode;
167 const bool be = builtin_exit_frame;
168
169 if (switch_to_central_stack) {
170 DCHECK_EQ(result_size, 1);
171 DCHECK_EQ(argv_mode, ArgvMode::kStack);
172 DCHECK_EQ(builtin_exit_frame, false);
173 return Builtin::kWasmCEntry;
174 }
175
176 if (rs == 1 && am == ArgvMode::kStack && !be) {
177 return Builtin::kCEntry_Return1_ArgvOnStack_NoBuiltinExit;
178 } else if (rs == 1 && am == ArgvMode::kStack && be) {
179 return Builtin::kCEntry_Return1_ArgvOnStack_BuiltinExit;
180 } else if (rs == 1 && am == ArgvMode::kRegister && !be) {
181 return Builtin::kCEntry_Return1_ArgvInRegister_NoBuiltinExit;
182 } else if (rs == 2 && am == ArgvMode::kStack && !be) {
183 return Builtin::kCEntry_Return2_ArgvOnStack_NoBuiltinExit;
184 } else if (rs == 2 && am == ArgvMode::kStack && be) {
185 return Builtin::kCEntry_Return2_ArgvOnStack_BuiltinExit;
186 } else if (rs == 2 && am == ArgvMode::kRegister && !be) {
187 return Builtin::kCEntry_Return2_ArgvInRegister_NoBuiltinExit;
188 }
189
190 UNREACHABLE();
191}
192
193// static
194constexpr Builtin Builtins::RuntimeCEntry(int result_size,
195 bool switch_to_central_stack) {
196 return CEntry(result_size, ArgvMode::kStack, false, switch_to_central_stack);
197}
198
199// static
200constexpr Builtin Builtins::InterpreterCEntry(int result_size) {
201 return CEntry(result_size, ArgvMode::kRegister);
202}
203
204// static
206 ConvertReceiverMode receiver_mode, InterpreterPushArgsMode mode) {
207 switch (mode) {
209 // There is no special-case handling of calls to Array. They will all go
210 // through the kOther case below.
211 UNREACHABLE();
213 return Builtin::kInterpreterPushArgsThenCallWithFinalSpread;
215 switch (receiver_mode) {
217 return Builtin::kInterpreterPushUndefinedAndArgsThenCall;
220 return Builtin::kInterpreterPushArgsThenCall;
221 }
222 }
223 UNREACHABLE();
224}
225
226// static
229 switch (mode) {
231 return Builtin::kInterpreterPushArgsThenConstructArrayFunction;
233 return Builtin::kInterpreterPushArgsThenConstructWithFinalSpread;
235 return Builtin::kInterpreterPushArgsThenConstruct;
236 }
237 UNREACHABLE();
238}
239
240// static
242 return isolate->builtin_entry_table()[Builtins::ToInt(builtin)];
243}
244
245// static
246constexpr bool Builtins::IsJSEntryVariant(Builtin builtin) {
247 switch (builtin) {
248 case Builtin::kJSEntry:
249 case Builtin::kJSConstructEntry:
250 case Builtin::kJSRunMicrotasksEntry:
251 return true;
252 default:
253 return false;
254 }
255 UNREACHABLE();
256}
257
258// static
260 CHECK(HasJSLinkage(builtin));
261
262 // TODO(saelo): consider merging GetFormalParameterCount and
263 // GetStackParameterCount into a single function.
264 if (Builtins::KindOf(builtin) == TSJ || Builtins::KindOf(builtin) == TFJ) {
265 return Builtins::GetStackParameterCount(builtin);
266 } else if (Builtins::KindOf(builtin) == ASM ||
267 Builtins::KindOf(builtin) == TFC) {
268 // At the moment, all ASM builtins are varargs builtins. This is verified
269 // in CheckFormalParameterCount.
271 } else if (Builtins::KindOf(builtin) == CPP) {
272#define CPP_BUILTIN(Name, Argc) \
273 case Builtin::k##Name: \
274 return Argc;
275
276 switch (builtin) {
278 default:
279 UNREACHABLE();
280 }
281#undef CPP_BUILTIN
282 } else {
283 UNREACHABLE();
284 }
285}
286
287} // namespace internal
288} // namespace v8
289
290#endif // V8_BUILTINS_BUILTINS_INL_H_
#define BUILTIN_LIST_C(V)
#define CPP_BUILTIN(Name, Argc)
static constexpr Builtin InterpreterPushArgsThenCall(ConvertReceiverMode receiver_mode, InterpreterPushArgsMode mode)
static constexpr Builtin RecordWrite(SaveFPRegsMode fp_mode)
static constexpr Builtin InterpreterPushArgsThenConstruct(InterpreterPushArgsMode mode)
static V8_EXPORT_PRIVATE Kind KindOf(Builtin builtin)
Definition builtins.cc:471
static constexpr bool IsJSEntryVariant(Builtin builtin)
static constexpr Builtin OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint)
static int GetFormalParameterCount(Builtin builtin)
static V8_EXPORT_PRIVATE int GetStackParameterCount(Builtin builtin)
Definition builtins.cc:160
static constexpr Builtin RuntimeCEntry(int result_size, bool switch_to_central_stack=false)
static constexpr Builtin EphemeronKeyBarrier(SaveFPRegsMode fp_mode)
static constexpr Builtin CallFunction(ConvertReceiverMode=ConvertReceiverMode::kAny)
static constexpr Builtin AdaptorWithBuiltinExitFrame(int formal_parameter_count)
static constexpr int ToInt(Builtin id)
Definition builtins.h:144
static constexpr Builtin LoadGlobalICInOptimizedCode(TypeofMode typeof_mode)
static constexpr Builtin IndirectPointerBarrier(SaveFPRegsMode fp_mode)
static V8_EXPORT_PRIVATE bool HasJSLinkage(Builtin builtin)
Definition builtins.cc:220
static constexpr Builtin Call(ConvertReceiverMode=ConvertReceiverMode::kAny)
static constexpr Builtin NonPrimitiveToPrimitive(ToPrimitiveHint hint=ToPrimitiveHint::kDefault)
static Address EntryOf(Builtin builtin, Isolate *isolate)
static constexpr Builtin StringAdd(StringAddFlags flags=STRING_ADD_CHECK_NONE)
static constexpr Builtin InterpreterCEntry(int result_size)
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 constexpr bool IsAnyCall(Builtin builtin)
@ STRING_ADD_CONVERT_RIGHT
Definition type-hints.h:77
@ STRING_ADD_CHECK_NONE
Definition type-hints.h:74
@ STRING_ADD_CONVERT_LEFT
Definition type-hints.h:76
OrdinaryToPrimitiveHint
Definition globals.h:1860
constexpr uint16_t kDontAdaptArgumentsSentinel
Definition globals.h:2779
InterpreterPushArgsMode
Definition globals.h:2233
constexpr int JSParameterCount(int param_count_without_receiver)
Definition globals.h:2782
#define CHECK(condition)
Definition logging.h:124
#define DCHECK_EQ(v1, v2)
Definition logging.h:485