v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
builtins.cc
Go to the documentation of this file.
1// Copyright 2012 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
6
7#include "src/api/api-inl.h"
18#include "src/logging/code-events.h" // For CodeCreateEvent.
19#include "src/logging/log.h" // For V8FileLogger.
24#include "src/utils/ostreams.h"
25
26namespace v8 {
27namespace internal {
28
29// Forward declarations for C++ builtins.
30#define FORWARD_DECLARE(Name, Argc) \
31 Address Builtin_##Name(int argc, Address* args, Isolate* isolate);
33#undef FORWARD_DECLARE
34
35namespace {
36
37// TODO(jgruber): Pack in CallDescriptors::Key.
38struct BuiltinMetadata {
39 const char* name;
41
42 struct BytecodeAndScale {
45 };
46
47 static_assert(sizeof(interpreter::Bytecode) == 1);
48 static_assert(sizeof(interpreter::OperandScale) == 1);
49 static_assert(sizeof(BytecodeAndScale) <= sizeof(Address));
50
51 // The `data` field has kind-specific contents.
52 union KindSpecificData {
53 // TODO(jgruber): Union constructors are needed since C++11 does not support
54 // designated initializers (e.g.: {.parameter_count = count}). Update once
55 // we're at C++20 :)
56 // The constructors are marked constexpr to avoid the need for a static
57 // initializer for builtins.cc (see check-static-initializers.sh).
58 constexpr KindSpecificData() : cpp_entry(kNullAddress) {}
59 constexpr KindSpecificData(Address cpp_entry) : cpp_entry(cpp_entry) {}
60 constexpr KindSpecificData(int parameter_count,
61 int /* To disambiguate from above */)
62 : parameter_count(static_cast<int16_t>(parameter_count)) {}
63 constexpr KindSpecificData(interpreter::Bytecode bytecode,
65 : bytecode_and_scale{bytecode, scale} {}
66 Address cpp_entry; // For CPP builtins.
67 int16_t parameter_count; // For TFJ builtins.
68 BytecodeAndScale bytecode_and_scale; // For BCH builtins.
69 } data;
70};
71
72#define DECL_CPP(Name, Argc) \
73 {#Name, Builtins::CPP, {FUNCTION_ADDR(Builtin_##Name)}},
74#define DECL_TSJ(Name, Count, ...) {#Name, Builtins::TSJ, {Count, 0}},
75#define DECL_TFJ(Name, Count, ...) {#Name, Builtins::TFJ, {Count, 0}},
76#define DECL_TSC(Name, ...) {#Name, Builtins::TSC, {}},
77#define DECL_TFC(Name, ...) {#Name, Builtins::TFC, {}},
78#define DECL_TFS(Name, ...) {#Name, Builtins::TFS, {}},
79#define DECL_TFH(Name, ...) {#Name, Builtins::TFH, {}},
80#define DECL_BCH(Name, OperandScale, Bytecode) \
81 {#Name, Builtins::BCH, {Bytecode, OperandScale}},
82#define DECL_ASM(Name, ...) {#Name, Builtins::ASM, {}},
83const BuiltinMetadata builtin_metadata[] = {
86#undef DECL_CPP
87#undef DECL_TFJ
88#undef DECL_TSC
89#undef DECL_TFC
90#undef DECL_TFS
91#undef DECL_TFH
92#undef DECL_BCH
93#undef DECL_ASM
94
95} // namespace
96
103
111
113
115 // Off-heap pc's can be looked up through binary search.
117 if (Builtins::IsBuiltinId(builtin)) return name(builtin);
118
119 // May be called during initialization (disassembler).
120 if (!initialized_) return nullptr;
121 for (Builtin builtin_ix = Builtins::kFirst; builtin_ix <= Builtins::kLast;
122 ++builtin_ix) {
123 if (code(builtin_ix)->contains(isolate_, pc)) {
124 return name(builtin_ix);
125 }
126 }
127 return nullptr;
128}
129
131 Address* location = &isolate_->builtin_table()[Builtins::ToInt(builtin)];
132 return FullObjectSlot(location);
133}
134
136 DCHECK(IsTier0(builtin));
137 Address* location =
138 &isolate_->builtin_tier0_table()[Builtins::ToInt(builtin)];
139 return FullObjectSlot(location);
140}
141
143 DCHECK_EQ(builtin, code->builtin_id());
145 // The given builtin may be uninitialized thus we cannot check its type here.
146 isolate_->builtin_table()[Builtins::ToInt(builtin)] = code.ptr();
147}
148
150 Address ptr = isolate_->builtin_table()[Builtins::ToInt(builtin)];
151 return Cast<Code>(Tagged<Object>(ptr));
152}
153
155 Address* location = &isolate_->builtin_table()[Builtins::ToInt(builtin)];
156 return Handle<Code>(location);
157}
158
159// static
161 DCHECK(Builtins::KindOf(builtin) == TSJ || Builtins::KindOf(builtin) == TFJ);
162 return builtin_metadata[ToInt(builtin)].data.parameter_count;
163}
164
165// static
167 Builtin builtin, int function_length,
168 int formal_parameter_count_with_receiver) {
169 DCHECK_LE(0, function_length);
170 if (!Builtins::IsBuiltinId(builtin)) {
171 return true;
172 }
173
174 if (!HasJSLinkage(builtin)) {
175 return true;
176 }
177
178 // Some special builtins are allowed to be installed on functions with
179 // different parameter counts.
180 if (builtin == Builtin::kCompileLazy) {
181 return true;
182 }
183
185 return parameter_count == formal_parameter_count_with_receiver;
186}
187
188// static
191 switch (builtin) {
192// This macro is deliberately crafted so as to emit very little code,
193// in order to keep binary size of this function under control.
194#define CASE_OTHER(Name, ...) \
195 case Builtin::k##Name: { \
196 key = Builtin_##Name##_InterfaceDescriptor::key(); \
197 break; \
198 }
201#undef CASE_OTHER
202 default:
205 if (kind == TSJ || kind == TFJ || kind == CPP) {
206 return JSTrampolineDescriptor{};
207 }
208 UNREACHABLE();
209 }
211}
212
213// static
215 Handle<Code> code = isolate->builtins()->code_handle(builtin);
216 return Callable{code, CallInterfaceDescriptorFor(builtin)};
217}
218
219// static
224
225// static
226const char* Builtins::name(Builtin builtin) {
227 int index = ToInt(builtin);
228 DCHECK(IsBuiltinId(index));
229 return builtin_metadata[index].name;
230}
231
232// static
233const char* Builtins::NameForStackTrace(Isolate* isolate, Builtin builtin) {
234#if V8_ENABLE_WEBASSEMBLY
235 // Most builtins are never shown in stack traces. Those that are exposed
236 // to JavaScript get their name from the object referring to them. Here
237 // we only support a few internal builtins that have special reasons for
238 // being shown on stack traces:
239 // - builtins that are allowlisted in {StubFrame::Summarize}.
240 // - builtins that throw the same error as one of those above, but would
241 // lose information and e.g. print "indexOf" instead of "String.indexOf".
242 switch (builtin) {
243 case Builtin::kDataViewPrototypeGetBigInt64:
244 return "DataView.prototype.getBigInt64";
245 case Builtin::kDataViewPrototypeGetBigUint64:
246 return "DataView.prototype.getBigUint64";
247 case Builtin::kDataViewPrototypeGetFloat16:
248 return "DataView.prototype.getFloat16";
249 case Builtin::kDataViewPrototypeGetFloat32:
250 return "DataView.prototype.getFloat32";
251 case Builtin::kDataViewPrototypeGetFloat64:
252 return "DataView.prototype.getFloat64";
253 case Builtin::kDataViewPrototypeGetInt8:
254 return "DataView.prototype.getInt8";
255 case Builtin::kDataViewPrototypeGetInt16:
256 return "DataView.prototype.getInt16";
257 case Builtin::kDataViewPrototypeGetInt32:
258 return "DataView.prototype.getInt32";
259 case Builtin::kDataViewPrototypeGetUint8:
260 return "DataView.prototype.getUint8";
261 case Builtin::kDataViewPrototypeGetUint16:
262 return "DataView.prototype.getUint16";
263 case Builtin::kDataViewPrototypeGetUint32:
264 return "DataView.prototype.getUint32";
265 case Builtin::kDataViewPrototypeSetBigInt64:
266 return "DataView.prototype.setBigInt64";
267 case Builtin::kDataViewPrototypeSetBigUint64:
268 return "DataView.prototype.setBigUint64";
269 case Builtin::kDataViewPrototypeSetFloat16:
270 return "DataView.prototype.setFloat16";
271 case Builtin::kDataViewPrototypeSetFloat32:
272 return "DataView.prototype.setFloat32";
273 case Builtin::kDataViewPrototypeSetFloat64:
274 return "DataView.prototype.setFloat64";
275 case Builtin::kDataViewPrototypeSetInt8:
276 return "DataView.prototype.setInt8";
277 case Builtin::kDataViewPrototypeSetInt16:
278 return "DataView.prototype.setInt16";
279 case Builtin::kDataViewPrototypeSetInt32:
280 return "DataView.prototype.setInt32";
281 case Builtin::kDataViewPrototypeSetUint8:
282 return "DataView.prototype.setUint8";
283 case Builtin::kDataViewPrototypeSetUint16:
284 return "DataView.prototype.setUint16";
285 case Builtin::kDataViewPrototypeSetUint32:
286 return "DataView.prototype.setUint32";
287 case Builtin::kDataViewPrototypeGetByteLength:
288 return "get DataView.prototype.byteLength";
289 case Builtin::kThrowDataViewDetachedError:
290 case Builtin::kThrowDataViewOutOfBounds:
291 case Builtin::kThrowDataViewTypeError: {
292 DataViewOp op = static_cast<DataViewOp>(isolate->error_message_param());
293 return ToString(op);
294 }
295 case Builtin::kStringPrototypeToLocaleLowerCase:
296 return "String.toLocaleLowerCase";
297 case Builtin::kStringPrototypeIndexOf:
298 case Builtin::kThrowIndexOfCalledOnNull:
299 return "String.indexOf";
300#if V8_INTL_SUPPORT
301 case Builtin::kStringPrototypeToLowerCaseIntl:
302#endif
303 case Builtin::kThrowToLowerCaseCalledOnNull:
304 return "String.toLowerCase";
305 case Builtin::kWasmIntToString:
306 return "Number.toString";
307 default:
308 // Callers getting this might well crash, which might be desirable
309 // because it's similar to {UNREACHABLE()}, but contrary to that a
310 // careful caller can also check the value and use it as an "is a
311 // name available for this builtin?" check.
312 return nullptr;
313 }
314#else
315 return nullptr;
316#endif // V8_ENABLE_WEBASSEMBLY
317}
318
320 DCHECK(v8_flags.print_builtin_code);
321#ifdef ENABLE_DISASSEMBLER
322 for (Builtin builtin = Builtins::kFirst; builtin <= Builtins::kLast;
323 ++builtin) {
324 const char* builtin_name = name(builtin);
325 if (PassesFilter(base::CStrVector(builtin_name),
326 base::CStrVector(v8_flags.print_builtin_code_filter))) {
327 CodeTracer::Scope trace_scope(isolate_->GetCodeTracer());
328 OFStream os(trace_scope.file());
329 Tagged<Code> builtin_code = code(builtin);
330 builtin_code->Disassemble(builtin_name, os, isolate_);
331 os << "\n";
332 }
333 }
334#endif
335}
336
338 DCHECK(v8_flags.print_builtin_size);
339 for (Builtin builtin = Builtins::kFirst; builtin <= Builtins::kLast;
340 ++builtin) {
341 const char* builtin_name = name(builtin);
342 const char* kind = KindNameOf(builtin);
343 Tagged<Code> code = Builtins::code(builtin);
344 PrintF(stdout, "%s Builtin, %s, %d\n", kind, builtin_name,
345 code->instruction_size());
346 }
347}
348
349// static
351 DCHECK(Builtins::IsCpp(builtin));
352 return builtin_metadata[ToInt(builtin)].data.cpp_entry;
353}
354
355// static
357 return Builtins::IsBuiltinId(code->builtin_id());
358}
359
361 Builtin* builtin) const {
362 Address* handle_location = maybe_code.location();
363 Address* builtins_table = isolate_->builtin_table();
364 if (handle_location < builtins_table) return false;
365 Address* builtins_table_end = &builtins_table[Builtins::kBuiltinCount];
366 if (handle_location >= builtins_table_end) return false;
367 *builtin = FromInt(static_cast<int>(handle_location - builtins_table));
368 return true;
369}
370
371// static
373 Builtin builtin = code->builtin_id();
374 return Builtins::IsBuiltinId(builtin) &&
376}
377
378// static
380 EmbeddedData embedded_data = EmbeddedData::FromBlob(isolate);
381 IsolateData* isolate_data = isolate->isolate_data();
382
383 // The entry table.
385 DCHECK(Builtins::IsBuiltinId(isolate->builtins()->code(i)->builtin_id()));
386 DCHECK(!isolate->builtins()->code(i)->has_instruction_stream());
387 isolate_data->builtin_entry_table()[ToInt(i)] =
388 embedded_data.InstructionStartOf(i);
389 }
390
391 // T0 tables.
393 const int ii = ToInt(i);
394 isolate_data->builtin_tier0_entry_table()[ii] =
395 isolate_data->builtin_entry_table()[ii];
396 isolate_data->builtin_tier0_table()[ii] = isolate_data->builtin_table()[ii];
397 }
398}
399
400// static
402 if (!isolate->IsLoggingCodeCreation()) return;
403
404 Address* builtins = isolate->builtin_table();
405 int i = 0;
406 HandleScope scope(isolate);
407 for (; i < ToInt(Builtin::kFirstBytecodeHandler); i++) {
408 auto builtin_code = DirectHandle<Code>::FromSlot(&builtins[i]);
410 PROFILE(isolate, CodeCreateEvent(LogEventListener::CodeTag::kBuiltin, code,
412 }
413
415 for (; i < kBuiltinCount; i++) {
416 auto builtin_code = DirectHandle<Code>::FromSlot(&builtins[i]);
418 interpreter::Bytecode bytecode =
419 builtin_metadata[i].data.bytecode_and_scale.bytecode;
421 builtin_metadata[i].data.bytecode_and_scale.scale;
422 PROFILE(isolate,
423 CodeCreateEvent(
424 LogEventListener::CodeTag::kBytecodeHandler, code,
425 interpreter::Bytecodes::ToString(bytecode, scale).c_str()));
426 }
427}
428
429// static
431 Isolate* isolate) {
432 DCHECK_NOT_NULL(isolate->embedded_blob_code());
433 DCHECK_NE(0, isolate->embedded_blob_code_size());
434
435 Tagged<Code> code = isolate->builtins()->code(
436 Builtin::kInterpreterEntryTrampolineForProfiling);
437
438 CodeDesc desc;
439 desc.buffer = reinterpret_cast<uint8_t*>(code->instruction_start());
440
441 int instruction_size = code->instruction_size();
442 desc.buffer_size = instruction_size;
443 desc.instr_size = instruction_size;
444
445 // Ensure the code doesn't require creation of metadata, otherwise respective
446 // fields of CodeDesc should be initialized.
447 DCHECK_EQ(code->safepoint_table_size(), 0);
448 DCHECK_EQ(code->handler_table_size(), 0);
449 DCHECK_EQ(code->constant_pool_size(), 0);
450 // TODO(v8:11036): The following DCHECK currently fails if the mksnapshot is
451 // run with enabled code comments, i.e. --interpreted_frames_native_stack is
452 // incompatible with --code-comments at mksnapshot-time. If ever needed,
453 // implement support.
454 DCHECK_EQ(code->code_comments_size(), 0);
455 DCHECK_EQ(code->unwinding_info_size(), 0);
456
457 desc.safepoint_table_offset = instruction_size;
458 desc.handler_table_offset = instruction_size;
459 desc.constant_pool_offset = instruction_size;
460 desc.code_comments_offset = instruction_size;
461 desc.builtin_jump_table_info_offset = instruction_size;
462
463 CodeDesc::Verify(&desc);
464
465 return Factory::CodeBuilder(isolate, desc, CodeKind::BUILTIN)
466 // Mimic the InterpreterEntryTrampoline.
467 .set_builtin(Builtin::kInterpreterEntryTrampoline)
468 .Build();
469}
470
472 DCHECK(IsBuiltinId(builtin));
473 return builtin_metadata[ToInt(builtin)].kind;
474}
475
476// static
477const char* Builtins::KindNameOf(Builtin builtin) {
478 Kind kind = Builtins::KindOf(builtin);
479 // clang-format off
480 switch (kind) {
481 case CPP: return "CPP";
482 case TSJ: return "TSJ";
483 case TFJ: return "TFJ";
484 case TSC: return "TSC";
485 case TFC: return "TFC";
486 case TFS: return "TFS";
487 case TFH: return "TFH";
488 case BCH: return "BCH";
489 case ASM: return "ASM";
490 }
491 // clang-format on
492 UNREACHABLE();
493}
494
495// static
497 return Builtins::KindOf(builtin) == CPP;
498}
499
500// static
502 if (builtin == Builtin::kNoBuiltinId) {
503 // Special case needed for example for tests.
505 }
506
507#if V8_ENABLE_DRUMBRAKE
508 if (builtin == Builtin::kGenericJSToWasmInterpreterWrapper) {
509 return kJSEntrypointTag;
510 } else if (builtin == Builtin::kGenericWasmToJSInterpreterWrapper) {
511 return kWasmEntrypointTag;
512 }
513#endif // V8_ENABLE_DRUMBRAKE
514
515 Kind kind = Builtins::KindOf(builtin);
516 switch (kind) {
517 case CPP:
518 case TSJ:
519 case TFJ:
520 return kJSEntrypointTag;
521 case BCH:
523 case TFC:
524 case TSC:
525 case TFS:
526 case TFH:
527 case ASM:
528 return CallInterfaceDescriptorFor(builtin).tag();
529 }
530 UNREACHABLE();
531}
532
533// static
535 Isolate* isolate, DirectHandle<JSFunction> target,
536 DirectHandle<JSObject> target_global_proxy) {
537 if (v8_flags.allow_unsafe_function_constructor) return true;
538 HandleScopeImplementer* impl = isolate->handle_scope_implementer();
539 DirectHandle<NativeContext> responsible_context = impl->LastEnteredContext();
540 // TODO(verwaest): Remove this.
541 if (responsible_context.is_null()) {
542 return true;
543 }
544 if (*responsible_context == target->context()) return true;
545 return isolate->MayAccess(responsible_context, target_global_proxy);
546}
547
549 size_t function_pointer_type_id) {
550 switch (function_pointer_type_id) {
551#define FUNCTION_POINTER_ID_CASE(id, name) \
552 case id: \
553 return Builtin::k##name;
554 TORQUE_FUNCTION_POINTER_TYPE_TO_BUILTIN_MAP(FUNCTION_POINTER_ID_CASE)
555#undef FUNCTION_POINTER_ID_CASE
556 default:
557 UNREACHABLE();
558 }
559}
560
561} // namespace internal
562} // namespace v8
Isolate * isolate_
#define BUILTIN_LIST_C(V)
#define IGNORE_BUILTIN(...)
BytecodeAndScale bytecode_and_scale
Definition builtins.cc:68
#define CASE_OTHER(Name,...)
#define DECL_TFJ(Name, Count,...)
Definition builtins.cc:75
int16_t parameter_count
Definition builtins.cc:67
#define DECL_ASM(Name,...)
Definition builtins.cc:82
#define DECL_TSC(Name,...)
Definition builtins.cc:76
#define DECL_TFC(Name,...)
Definition builtins.cc:77
#define DECL_TFS(Name,...)
Definition builtins.cc:78
#define FUNCTION_POINTER_ID_CASE(id, name)
interpreter::OperandScale scale
Definition builtins.cc:44
#define DECL_CPP(Name, Argc)
Definition builtins.cc:72
#define DECL_TSJ(Name, Count,...)
Definition builtins.cc:74
#define DECL_BCH(Name, OperandScale, Bytecode)
Definition builtins.cc:80
Builtins::Kind kind
Definition builtins.cc:40
#define DECL_TFH(Name,...)
Definition builtins.cc:79
#define FORWARD_DECLARE(Name, Argc)
Definition builtins.cc:30
Address cpp_entry
Definition builtins.cc:66
static bool AllowDynamicFunction(Isolate *isolate, DirectHandle< JSFunction > target, DirectHandle< JSObject > target_global_proxy)
Definition builtins.cc:534
static V8_EXPORT_PRIVATE bool IsCpp(Builtin builtin)
Definition builtins.cc:496
static bool IsIsolateIndependentBuiltin(Tagged< Code > code)
Definition builtins.cc:372
static V8_EXPORT_PRIVATE Kind KindOf(Builtin builtin)
Definition builtins.cc:471
V8_EXPORT_PRIVATE Tagged< Code > code(Builtin builtin)
Definition builtins.cc:149
V8_EXPORT_PRIVATE Handle< Code > code_handle(Builtin builtin)
Definition builtins.cc:154
static BytecodeOffset GetContinuationBytecodeOffset(Builtin builtin)
Definition builtins.cc:97
static CallInterfaceDescriptor CallInterfaceDescriptorFor(Builtin builtin)
Definition builtins.cc:189
static constexpr int kBuiltinCount
Definition builtins.h:105
static constexpr int kLastBytecodeHandlerPlusOne
Definition builtins.h:122
static Address CppEntryOf(Builtin builtin)
Definition builtins.cc:350
const char * Lookup(Address pc)
Definition builtins.cc:114
static constexpr Builtin kFirst
Definition builtins.h:112
static int GetFormalParameterCount(Builtin builtin)
static V8_EXPORT_PRIVATE int GetStackParameterCount(Builtin builtin)
Definition builtins.cc:160
static Builtin GetBuiltinFromBytecodeOffset(BytecodeOffset)
Definition builtins.cc:104
FullObjectSlot builtin_slot(Builtin builtin)
Definition builtins.cc:130
FullObjectSlot builtin_tier0_slot(Builtin builtin)
Definition builtins.cc:135
static V8_EXPORT_PRIVATE CodeEntrypointTag EntrypointTagFor(Builtin builtin)
Definition builtins.cc:501
static constexpr bool IsIsolateIndependent(Builtin builtin)
Definition builtins.h:266
static constexpr int ToInt(Builtin id)
Definition builtins.h:144
static const char * KindNameOf(Builtin builtin)
Definition builtins.cc:477
static void InitializeIsolateDataTables(Isolate *isolate)
Definition builtins.cc:379
static void EmitCodeCreateEvents(Isolate *isolate)
Definition builtins.cc:401
static V8_EXPORT_PRIVATE const char * NameForStackTrace(Isolate *isolate, Builtin builtin)
Definition builtins.cc:233
static DirectHandle< Code > CreateInterpreterEntryTrampolineForProfiling(Isolate *isolate)
Definition builtins.cc:430
void set_code(Builtin builtin, Tagged< Code > code)
Definition builtins.cc:142
static constexpr bool IsBuiltinId(Builtin builtin)
Definition builtins.h:128
static constexpr Builtin FromInt(int id)
Definition builtins.h:140
static constexpr bool IsTier0(Builtin builtin)
Definition builtins.h:136
static V8_EXPORT_PRIVATE bool HasJSLinkage(Builtin builtin)
Definition builtins.cc:220
static constexpr Builtin kLast
Definition builtins.h:113
bool IsBuiltinHandle(IndirectHandle< HeapObject > maybe_code, Builtin *index) const
Definition builtins.cc:360
static bool IsBuiltin(const Tagged< Code > code)
Definition builtins.cc:356
static constexpr Builtin kLastTier0
Definition builtins.h:114
static V8_EXPORT_PRIVATE const char * name(Builtin builtin)
Definition builtins.cc:226
static bool CheckFormalParameterCount(Builtin builtin, int function_length, int formal_parameter_count_with_receiver)
Definition builtins.cc:166
static V8_EXPORT_PRIVATE Callable CallableFor(Isolate *isolate, Builtin builtin)
Definition builtins.cc:214
static const int kFirstBuiltinContinuationId
Definition utils.h:704
static void Verify(const CodeDesc *desc)
Definition code-desc.h:41
V8_INLINE bool is_null() const
Definition handles.h:693
static V8_INLINE DirectHandle FromSlot(Address *slot)
Definition handles.h:687
Address InstructionStartOf(Builtin builtin) const
static EmbeddedData FromBlob()
CodeBuilder & set_builtin(Builtin builtin)
Definition factory.h:1169
V8_WARN_UNUSED_RESULT Handle< Code > Build()
Definition factory.cc:288
V8_INLINE Address * location() const
Definition handles.h:80
static V8_INLINE constexpr bool HasHeapObjectTag(Address value)
Address * builtin_tier0_entry_table()
static Builtin TryLookupCode(Isolate *isolate, Address address)
static const char * ToString(Bytecode bytecode)
Definition bytecodes.cc:123
#define PROFILE(the_isolate, Call)
Definition code-events.h:59
Handle< Code > code
DataViewOp
Builtin builtin
signed short int16_t
Definition unicode.cc:38
Vector< const char > CStrVector(const char *data)
Definition vector.h:331
constexpr const char * ToString(DeoptimizeKind kind)
Definition globals.h:880
void PrintF(const char *format,...)
Definition utils.cc:39
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
Definition flags.cc:2086
bool PassesFilter(base::Vector< const char > name, base::Vector< const char > filter)
Definition utils.cc:238
V8_EXPORT_PRIVATE FlagValues v8_flags
static constexpr Address kNullAddress
Definition v8-internal.h:53
Builtin ExampleBuiltinForTorqueFunctionPointerType(size_t function_pointer_type_id)
Definition builtins.cc:548
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
Local< T > Handle
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485