5#ifndef V8_EXECUTION_ISOLATE_DATA_H_
6#define V8_EXECUTION_ISOLATE_DATA_H_
21#include "testing/gtest/include/gtest/gtest_prod.h"
27class TrustedPointerPublishingScope;
33#if V8_HOST_ARCH_64_BIT
40#if V8_HOST_ARCH_64_BIT
41#define ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
42 V(kFastCCallAlignmentPaddingOffset, \
43 kFastCCallAlignmentPaddingCount* kSystemPointerSize, \
44 fast_c_call_alignment_padding)
46#define ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
47 V(kFastCCallAlignmentPaddingOffset, \
48 kFastCCallAlignmentPaddingCount* kSystemPointerSize, \
49 fast_c_call_alignment_padding)
52#ifdef V8_ENABLE_LEAPTIERING
54#define BUILTINS_WITH_DISPATCH_ADAPTER(V, CamelName, underscore_name, ...) \
55 V(CamelName, CamelName##SharedFun)
60#if V8_ENABLE_LEAPTIERING_BOOL
61#if V8_STATIC_ROOTS_BOOL
62#define V8_STATIC_DISPATCH_HANDLES_BOOL true
64#define V8_STATIC_DISPATCH_HANDLES_BOOL false
68#define BUILTINS_WITH_DISPATCH_LIST(V) \
69 BUILTINS_WITH_SFI_LIST_GENERATOR(BUILTINS_WITH_DISPATCH_ADAPTER, V)
71struct JSBuiltinDispatchHandleRoot {
73#define CASE(builtin_name, ...) k##builtin_name,
74 BUILTINS_WITH_DISPATCH_LIST(
CASE)
80 static constexpr size_t kPadding = Idx::kCount *
sizeof(JSDispatchHandle) %
82 sizeof(JSDispatchHandle);
83 static constexpr size_t kTableSize = Idx::kCount + kPadding;
85 static inline Builtin to_builtin(Idx idx) {
86#define CASE(builtin_name, ...) Builtin::k##builtin_name,
87 return std::array<Builtin, Idx::kCount>{
88 BUILTINS_WITH_DISPATCH_LIST(
CASE)}[idx];
91 static inline Idx to_idx(Builtin builtin) {
93#define CASE(builtin_name, ...) \
94 case Builtin::k##builtin_name: \
95 return Idx::k##builtin_name;
96 BUILTINS_WITH_DISPATCH_LIST(
CASE)
103 static inline Idx to_idx(RootIndex root_idx) {
105#define CASE(builtin_name, shared_fun_name, ...) \
106 case RootIndex::k##shared_fun_name: \
107 return Idx::k##builtin_name;
108 BUILTINS_WITH_DISPATCH_LIST(
CASE)
119#define ISOLATE_DATA_FIELDS(V) \
121 V(CageBase, kSystemPointerSize, cage_base) \
122 V(StackGuard, StackGuard::kSizeInBytes, stack_guard) \
123 V(IsMarkingFlag, kUInt8Size, is_marking_flag) \
124 V(IsMinorMarkingFlag, kUInt8Size, is_minor_marking_flag) \
125 V(IsSharedSpaceIsolateFlag, kUInt8Size, is_shared_space_isolate_flag) \
126 V(UsesSharedHeapFlag, kUInt8Size, uses_shared_heap_flag) \
127 V(ExecutionMode, kUInt8Size, execution_mode) \
128 V(StackIsIterable, kUInt8Size, stack_is_iterable) \
129 V(ErrorMessageParam, kUInt8Size, error_message_param) \
130 V(TablesAlignmentPadding, 1, tables_alignment_padding) \
131 V(RegExpStaticResultOffsetsVector, kSystemPointerSize, \
132 regexp_static_result_offsets_vector) \
134 V(BuiltinTier0EntryTable, Builtins::kBuiltinTier0Count* kSystemPointerSize, \
135 builtin_tier0_entry_table) \
136 V(BuiltinsTier0Table, Builtins::kBuiltinTier0Count* kSystemPointerSize, \
137 builtin_tier0_table) \
139 V(NewAllocationInfo, LinearAllocationArea::kSize, new_allocation_info) \
140 V(OldAllocationInfo, LinearAllocationArea::kSize, old_allocation_info) \
141 ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
142 V(FastCCallCallerPC, kSystemPointerSize, fast_c_call_caller_pc) \
143 V(FastCCallCallerFP, kSystemPointerSize, fast_c_call_caller_fp) \
144 V(FastApiCallTarget, kSystemPointerSize, fast_api_call_target) \
145 V(LongTaskStatsCounter, kSizetSize, long_task_stats_counter) \
146 V(ThreadLocalTop, ThreadLocalTop::kSizeInBytes, thread_local_top) \
147 V(HandleScopeData, HandleScopeData::kSizeInBytes, handle_scope_data) \
148 V(EmbedderData, Internals::kNumIsolateDataSlots* kSystemPointerSize, \
150 ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V) \
151 ISOLATE_DATA_FIELDS_SANDBOX(V) \
152 V(ApiCallbackThunkArgument, kSystemPointerSize, api_callback_thunk_argument) \
153 V(RegexpExecVectorArgument, kSystemPointerSize, regexp_exec_vector_argument) \
154 V(ContinuationPreservedEmbedderData, kSystemPointerSize, \
155 continuation_preserved_embedder_data) \
157 V(RootsTable, RootsTable::kEntriesCount* kSystemPointerSize, roots_table) \
158 V(ExternalReferenceTable, ExternalReferenceTable::kSizeInBytes, \
159 external_reference_table) \
160 V(BuiltinEntryTable, Builtins::kBuiltinCount* kSystemPointerSize, \
161 builtin_entry_table) \
162 V(BuiltinTable, Builtins::kBuiltinCount* kSystemPointerSize, builtin_table) \
163 V(ActiveStack, kSystemPointerSize, active_stack) \
164 ISOLATE_DATA_FIELDS_LEAPTIERING(V)
166#ifdef V8_COMPRESS_POINTERS
167#define ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V) \
168 V(ExternalPointerTable, sizeof(ExternalPointerTable), \
169 external_pointer_table) \
170 V(SharedExternalPointerTable, kSystemPointerSize, \
171 shared_external_pointer_table) \
172 V(CppHeapPointerTable, sizeof(CppHeapPointerTable), cpp_heap_pointer_table)
174#define ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V)
177#ifdef V8_ENABLE_SANDBOX
178#define ISOLATE_DATA_FIELDS_SANDBOX(V) \
179 V(TrustedCageBase, kSystemPointerSize, trusted_cage_base) \
180 V(TrustedPointerTable, sizeof(TrustedPointerTable), trusted_pointer_table) \
181 V(SharedTrustedPointerTable, kSystemPointerSize, \
182 shared_trusted_pointer_table) \
183 V(TrustedPointerPublishingScope, kSystemPointerSize, \
184 trusted_pointer_publishing_scope) \
185 V(CodePointerTableBaseAddress, kSystemPointerSize, \
186 code_pointer_table_base_address)
188#define ISOLATE_DATA_FIELDS_SANDBOX(V)
191#if V8_ENABLE_LEAPTIERING_BOOL && !V8_STATIC_DISPATCH_HANDLES_BOOL
193#define ISOLATE_DATA_FIELDS_LEAPTIERING(V) \
194 V(BuiltinDispatchTable, \
195 (JSBuiltinDispatchHandleRoot::kTableSize) * sizeof(JSDispatchHandle), \
196 builtin_dispatch_table)
199#define ISOLATE_DATA_FIELDS_LEAPTIERING(V)
203#define EXTERNAL_REFERENCE_LIST_ISOLATE_FIELDS(V) \
204 V(isolate_address, "isolate address", IsolateAddress) \
205 V(jslimit_address, "jslimit address", JsLimitAddress)
208#define PLUS_1(...) +1
214#define FIELD(name, comment, camel) k##camel,
217#define FIELD(camel, ...) k##camel,
230#ifdef V8_COMPRESS_POINTERS
234#ifdef V8_ENABLE_SANDBOX
236 trusted_cage_base_(group->GetTrustedPtrComprCageBase()),
237 code_pointer_table_base_address_(
238 group->code_pointer_table()->base_address())
255#define V(CamelName, Size, hacker_name) \
256 static constexpr int hacker_name##_offset() { \
257 return k##CamelName##Offset - kIsolateRootBias; \
269 : builtin_entry_table_offset()) +
278 : builtin_table_offset()) +
290#define V(Offset, Size, Name) \
291 Address Name##_address() const { return reinterpret_cast<Address>(&Name##_); }
337#if V8_ENABLE_LEAPTIERING_BOOL && !V8_STATIC_DISPATCH_HANDLES_BOOL
339 return builtin_dispatch_table_[JSBuiltinDispatchHandleRoot::to_idx(
354 static_assert(std::is_unsigned<Address>::value);
356 return (address -
start) <
sizeof(*this);
360#define THREAD_LOCAL_TOP_MEMBER_OFFSET(Name) \
361 static constexpr uint32_t Name##_offset() { \
362 return static_cast<uint32_t>(IsolateData::thread_local_top_offset() + \
363 OFFSET_OF(ThreadLocalTop, Name##_)); \
369#undef THREAD_LOCAL_TOP_MEMBER_OFFSET
375 case IsolateFieldId::kIsolateAddress:
377 case IsolateFieldId::kJsLimitAddress:
379#define CASE(camel, size, name) \
380 case IsolateFieldId::k##camel: \
381 return IsolateData::name##_offset();
398 ISOLATE_DATA_FIELDS(V) \
401 8 + RoundUp<8>(static_cast<int>(kPaddingOffset)) - kPaddingOffset) \
446 static_assert(
FIELD_SIZE(kTablesAlignmentPaddingOffset) > 0);
494#ifdef V8_COMPRESS_POINTERS
495 ExternalPointerTable external_pointer_table_;
496 ExternalPointerTable* shared_external_pointer_table_ =
nullptr;
497 CppHeapPointerTable cpp_heap_pointer_table_;
500#ifdef V8_ENABLE_SANDBOX
501 const Address trusted_cage_base_;
503 TrustedPointerTable trusted_pointer_table_;
504 TrustedPointerTable* shared_trusted_pointer_table_ =
nullptr;
507 const Address code_pointer_table_base_address_;
536#if V8_ENABLE_LEAPTIERING_BOOL && !V8_STATIC_DISPATCH_HANDLES_BOOL
538 JSDispatchHandle* builtin_dispatch_table() {
return builtin_dispatch_table_; }
540 builtin_dispatch_table_[JSBuiltinDispatchHandleRoot::kTableSize] = {};
549 static_assert(kPaddingOffsetEnd + 1 - kPaddingOffset >= 8);
550 char padding_[kPaddingOffsetEnd + 1 - kPaddingOffset];
557 FRIEND_TEST(HeapTest, ExternalLimitStaysAboveDefaultForExplicitHandling);
565 static_assert(std::is_standard_layout<StackGuard>::value);
566 static_assert(std::is_standard_layout<RootsTable>::value);
567 static_assert(std::is_standard_layout<ThreadLocalTop>::value);
568 static_assert(std::is_standard_layout<ExternalReferenceTable>::value);
569 static_assert(std::is_standard_layout<IsolateData>::value);
570 static_assert(std::is_standard_layout<LinearAllocationArea>::value);
571#define V(PureName, Size, Name) \
573 std::is_standard_layout<decltype(IsolateData::Name##_)>::value); \
574 static_assert(offsetof(IsolateData, Name##_) == k##PureName##Offset);
577 static_assert(
sizeof(
IsolateData) == IsolateData::kSizeOffset);
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr int kBuiltinCount
static constexpr int ToInt(Builtin id)
static constexpr int kBuiltinTier0Count
static constexpr bool IsBuiltinId(Builtin builtin)
static constexpr Builtin FromInt(int id)
static constexpr bool IsTier0(Builtin builtin)
static const uint32_t kNumIsolateDataSlots
ThreadLocalTop const & thread_local_top() const
Address * builtin_tier0_table()
wasm::StackMemory * active_stack_
static constexpr int builtin_slot_offset(int builtin_index)
IsolateData & operator=(const IsolateData &)=delete
static constexpr int BuiltinEntrySlotOffset(Builtin id)
Tagged< Object > continuation_preserved_embedder_data() const
Address isolate_root() const
uint8_t is_minor_marking_flag_
StackGuard * stack_guard()
Address builtin_tier0_table_[Builtins::kBuiltinTier0Count]
const RootsTable & roots() const
Address regexp_exec_vector_argument() const
Tagged< Object > continuation_preserved_embedder_data_
Address fast_c_call_caller_pc() const
bool contains(Address address) const
Address * builtin_table()
HandleScopeData handle_scope_data_
static constexpr int real_jslimit_offset()
uint8_t tables_alignment_padding_[FIELD_SIZE(kTablesAlignmentPaddingOffset)]
IsolateData(const IsolateData &)=delete
Address fast_api_call_target_
ExternalReferenceTable external_reference_table_
wasm::StackMemory * active_stack()
static constexpr intptr_t GetOffset(IsolateFieldId id)
Address builtin_tier0_entry_table_[Builtins::kBuiltinTier0Count]
uint8_t error_message_param_
Address builtin_entry_table_[Builtins::kBuiltinCount]
uint8_t stack_is_iterable_
void set_regexp_static_result_offsets_vector(int32_t *value)
Address fast_api_call_target() const
void * embedder_data_[Internals::kNumIsolateDataSlots]
ThreadLocalTop thread_local_top_
static constexpr int root_slot_offset(RootIndex root_index)
Address fast_c_call_caller_fp() const
FRIEND_TEST(HeapTest, ExternalLimitStaysAboveDefaultForExplicitHandling)
static constexpr intptr_t kIsolateRootBias
int32_t * regexp_static_result_offsets_vector_
uint8_t is_shared_space_isolate_flag_
Address api_callback_thunk_argument_
Address fast_c_call_alignment_padding_[kFastCCallAlignmentPaddingCount]
Address api_callback_thunk_argument() const
LinearAllocationArea new_allocation_info_
void set_continuation_preserved_embedder_data(Tagged< Object > data)
base::Flags< IsolateExecutionModeFlag, uint8_t, std::atomic< uint8_t > > execution_mode_
bool stack_is_iterable() const
static constexpr int exception_offset()
static constexpr int jslimit_offset()
int32_t * regexp_static_result_offsets_vector() const
LinearAllocationArea old_allocation_info_
Address cage_base() const
ExternalReferenceTable * external_reference_table()
Address fast_c_call_caller_fp_
Address * builtin_tier0_entry_table()
FRIEND_TEST(HeapTest, ExternalLimitDefault)
IsolateData(Isolate *isolate, IsolateGroup *group)
static constexpr int BuiltinSlotOffset(Builtin id)
Address regexp_exec_vector_argument_
size_t long_task_stats_counter_
void set_active_stack(wasm::StackMemory *stack)
static V8_INLINE void AssertPredictableLayout()
Address fast_c_call_caller_pc_
char padding_[kPaddingOffsetEnd+1 - kPaddingOffset]
Address * builtin_entry_table()
uint8_t uses_shared_heap_flag_
ThreadLocalTop & thread_local_top()
Address builtin_table_[Builtins::kBuiltinCount]
static constexpr int offset_of(RootIndex root_index)
static constexpr Tagged< Smi > zero()
static constexpr int jslimit_offset()
static constexpr int real_jslimit_offset()
static constexpr int exception_offset()
#define EXTERNAL_REFERENCE_LIST_ISOLATE_FIELDS(V)
#define THREAD_LOCAL_TOP_MEMBER_OFFSET(Name)
#define ISOLATE_DATA_FIELDS(V)
ZoneStack< RpoNumber > & stack
FIELD(name, comment, camel)
constexpr int kSystemPointerSize
static constexpr int kFastCCallAlignmentPaddingCount
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
static constexpr Address kNullAddress
constexpr int kRootRegisterBias
constexpr uint8_t kNumIsolateFieldIds
#define DCHECK(condition)
#define DEFINE_FIELD_OFFSET_CONSTANTS_WITH_PURE_NAME(StartOffset, LIST_MACRO)