blob: 13379e7f17079d22309fcee66c31ac2b7a090b76 [file] [log] [blame] [edit]
// Copyright 2025 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_EXECUTION_ISOLATE_DATA_FIELDS_H_
#define V8_EXECUTION_ISOLATE_DATA_FIELDS_H_
#include "src/common/globals.h"
#include "src/utils/utils.h"
namespace v8::internal {
#if V8_HOST_ARCH_64_BIT
// In kSystemPointerSize.
static constexpr int kFastCCallAlignmentPaddingCount = 5;
#else
static constexpr int kFastCCallAlignmentPaddingCount = 1;
#endif
#if V8_HOST_ARCH_64_BIT
#define ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
V(kFastCCallAlignmentPaddingOffset, \
kFastCCallAlignmentPaddingCount* kSystemPointerSize, \
fast_c_call_alignment_padding)
#else
#define ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
V(kFastCCallAlignmentPaddingOffset, \
kFastCCallAlignmentPaddingCount* kSystemPointerSize, \
fast_c_call_alignment_padding)
#endif // V8_HOST_ARCH_64_BIT
// IsolateData fields, defined as: V(CamelName, Size, hacker_name)
#define ISOLATE_DATA_FIELDS(V) \
/* Misc. fields. */ \
V(CageBase, kSystemPointerSize, cage_base) \
V(StackGuard, StackGuard::kSizeInBytes, stack_guard) \
V(IsMarkingFlag, kUInt8Size, is_marking_flag) \
V(IsMinorMarkingFlag, kUInt8Size, is_minor_marking_flag) \
V(IsSharedSpaceIsolateFlag, kUInt8Size, is_shared_space_isolate_flag) \
V(UsesSharedHeapFlag, kUInt8Size, uses_shared_heap_flag) \
V(ExecutionMode, kUInt8Size, execution_mode) \
V(StackIsIterable, kUInt8Size, stack_is_iterable) \
V(ErrorMessageParam, kUInt8Size, error_message_param) \
V(HasLazyClosures, kUInt8Size, has_lazy_closures) \
/* This padding aligns next field to kSystemPointerSize bytes. */ \
PADDING_FIELD(kSystemPointerSize, V, TablesAlignmentPadding, \
tables_alignment_padding) \
V(RegExpStaticResultOffsetsVector, kSystemPointerSize, \
regexp_static_result_offsets_vector) \
/* Tier 0 tables (small but fast access). */ \
V(BuiltinTier0EntryTable, Builtins::kBuiltinTier0Count* kSystemPointerSize, \
builtin_tier0_entry_table) \
V(BuiltinsTier0Table, Builtins::kBuiltinTier0Count* kSystemPointerSize, \
builtin_tier0_table) \
/* Misc. fields. */ \
V(NewAllocationInfo, LinearAllocationArea::Size(), new_allocation_info) \
V(OldAllocationInfo, LinearAllocationArea::Size(), old_allocation_info) \
V(LastYoungAllocation, kSystemPointerSize, last_young_allocation) \
ISOLATE_DATA_FAST_C_CALL_PADDING(V) \
V(FastCCallCallerPC, kSystemPointerSize, fast_c_call_caller_pc) \
V(FastCCallCallerFP, kSystemPointerSize, fast_c_call_caller_fp) \
V(FastApiCallTarget, kSystemPointerSize, fast_api_call_target) \
V(LongTaskStatsCounter, kSizetSize, long_task_stats_counter) \
V(ThreadLocalTop, ThreadLocalTop::kSizeInBytes, thread_local_top) \
V(HandleScopeData, HandleScopeData::kSizeInBytes, handle_scope_data) \
V(EmbedderData, Internals::kNumIsolateDataSlots* kSystemPointerSize, \
embedder_data) \
ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V) \
ISOLATE_DATA_FIELDS_SANDBOX(V) \
V(JSDispatchTable, sizeof(JSDispatchTable), js_dispatch_table) \
V(ApiCallbackThunkArgument, kSystemPointerSize, api_callback_thunk_argument) \
/* Because some architectures have a rather small offset in reg+offset */ \
/* addressing this field should be near the start. */ \
V(RegexpExecVectorArgument, kSystemPointerSize, regexp_exec_vector_argument) \
V(ContinuationPreservedEmbedderData, kSystemPointerSize, \
continuation_preserved_embedder_data) \
/* Full tables (arbitrary size, potentially slower access). */ \
V(RootsTable, RootsTable::kEntriesCount* kSystemPointerSize, roots_table) \
V(ExternalReferenceTable, ExternalReferenceTable::kSizeInBytes, \
external_reference_table) \
V(BuiltinEntryTable, Builtins::kBuiltinCount* kSystemPointerSize, \
builtin_entry_table) \
V(BuiltinTable, Builtins::kBuiltinCount* kSystemPointerSize, builtin_table) \
IF_WASM(V, ActiveStack, kSystemPointerSize, active_stack) \
IF_WASM(V, ActiveSuspender, kSystemPointerSize, active_suspender) \
V(DateCacheStamp, kInt32Size, date_cache_stamp) \
V(IsDateCacheUsed, kUInt8Size, is_date_cache_used) \
/* This padding aligns next field to kDoubleSize bytes. */ \
PADDING_FIELD(kDoubleSize, V, RawArgumentsPadding, raw_arguments_padding) \
V(RawArguments, 2 * kDoubleSize, raw_arguments) \
V(StressDeoptCount, kUInt64Size, stress_deopt_count) \
ISOLATE_DATA_FIELDS_TIERING(V)
#ifdef V8_COMPRESS_POINTERS
#define ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V) \
V(ExternalPointerTable, sizeof(ExternalPointerTable), \
external_pointer_table) \
V(SharedExternalPointerTable, kSystemPointerSize, \
shared_external_pointer_table) \
V(CppHeapPointerTable, sizeof(CppHeapPointerTable), cpp_heap_pointer_table)
#else
#define ISOLATE_DATA_FIELDS_POINTER_COMPRESSION(V)
#endif // V8_COMPRESS_POINTERS
#ifdef V8_ENABLE_SANDBOX
#define ISOLATE_DATA_FIELDS_SANDBOX(V) \
V(TrustedCageBase, kSystemPointerSize, trusted_cage_base) \
V(TrustedPointerTable, sizeof(TrustedPointerTable), trusted_pointer_table) \
V(SharedTrustedPointerTable, kSystemPointerSize, \
shared_trusted_pointer_table) \
V(TrustedPointerPublishingScope, kSystemPointerSize, \
trusted_pointer_publishing_scope) \
V(CodePointerTableBaseAddress, kSystemPointerSize, \
code_pointer_table_base_address)
#else
#define ISOLATE_DATA_FIELDS_SANDBOX(V)
#endif // V8_ENABLE_SANDBOX
#if V8_STATIC_DISPATCH_HANDLES_BOOL
#define ISOLATE_DATA_FIELDS_TIERING(V)
#else
#define ISOLATE_DATA_FIELDS_TIERING(V) \
V(BuiltinDispatchTable, \
(JSBuiltinDispatchHandleRoot::kTableSize) * sizeof(JSDispatchHandle), \
builtin_dispatch_table)
#endif // !V8_STATIC_DISPATCH_HANDLES_BOOL
// Data stored in complex IsolateData field, defined as:
// V(CamelName, hacker_name, holder_field_name, FieldOffset)
#define ISOLATE_DATA_SUBFIELDS(V) \
V(IsolateAddress, isolate_address, isolate_data, 0) \
\
/* ThreadLocalTop fields. */ \
V(Context, context, thread_local_top, offsetof(ThreadLocalTop, context_)) \
V(Exception, exception, thread_local_top, \
offsetof(ThreadLocalTop, exception_)) \
V(TopmostScriptHavingContext, topmost_script_having_context, \
thread_local_top, \
offsetof(ThreadLocalTop, topmost_script_having_context_)) \
V(CEntryFP, c_entry_fp, thread_local_top, \
offsetof(ThreadLocalTop, c_entry_fp_)) \
V(Handler, handler, thread_local_top, offsetof(ThreadLocalTop, handler_)) \
V(CFunction, c_function, thread_local_top, \
offsetof(ThreadLocalTop, c_function_)) \
V(PendingHandlerContext, pending_handler_context, thread_local_top, \
offsetof(ThreadLocalTop, pending_handler_context_)) \
V(PendingHandlerEntrypoint, pending_handler_entrypoint, thread_local_top, \
offsetof(ThreadLocalTop, pending_handler_entrypoint_)) \
V(PendingHandlerConstantPool, pending_handler_constant_pool, \
thread_local_top, \
offsetof(ThreadLocalTop, pending_handler_constant_pool_)) \
V(PendingHandlerFP, pending_handler_fp, thread_local_top, \
offsetof(ThreadLocalTop, pending_handler_fp_)) \
V(PendingHandlerSP, pending_handler_sp, thread_local_top, \
offsetof(ThreadLocalTop, pending_handler_sp_)) \
V(NumFramesAbovePendingHandler, num_frames_above_pending_handler, \
thread_local_top, \
offsetof(ThreadLocalTop, num_frames_above_pending_handler_)) \
V(IsOnCentralStackFlag, is_on_central_stack_flag, thread_local_top, \
offsetof(ThreadLocalTop, is_on_central_stack_flag_)) \
V(JSEntrySP, js_entry_sp, thread_local_top, \
offsetof(ThreadLocalTop, js_entry_sp_)) \
\
/* HandleScopeData fields. */ \
V(HandleScopeLevel, handle_scope_level, handle_scope_data, \
offsetof(HandleScopeData, level)) \
V(HandleScopeNext, handle_scope_next, handle_scope_data, \
offsetof(HandleScopeData, next)) \
V(HandleScopeLimit, handle_scope_limit, handle_scope_data, \
offsetof(HandleScopeData, limit)) \
\
/* NewAllocationInfo fields. */ \
V(NewAllocationInfoStart, new_allocation_info_start, new_allocation_info, \
LinearAllocationArea::StartOffset()) \
V(NewAllocationInfoTop, new_allocation_info_top, new_allocation_info, \
LinearAllocationArea::TopOffset()) \
V(NewAllocationInfoLimit, new_allocation_info_limit, new_allocation_info, \
LinearAllocationArea::LimitOffset()) \
\
/* OldAllocationInfo fields. */ \
V(OldAllocationInfoStart, old_allocation_info_start, old_allocation_info, \
LinearAllocationArea::StartOffset()) \
V(OldAllocationInfoTop, old_allocation_info_top, old_allocation_info, \
LinearAllocationArea::TopOffset()) \
V(OldAllocationInfoLimit, old_allocation_info_limit, old_allocation_info, \
LinearAllocationArea::LimitOffset()) \
\
/* StackGuard fields. */ \
V(JsLimit, jslimit, stack_guard, StackGuard::jslimit_offset()) \
V(RealJsLimit, real_jslimit, stack_guard, StackGuard::real_jslimit_offset()) \
V(NoHeapWriteInterruptRequest, no_heap_write_interrupt_request, stack_guard, \
StackGuard::no_heap_write_interrupt_request_offset())
constexpr uint8_t kNumIsolateFieldIds = 0
#define PLUS_1(...) +1
ISOLATE_DATA_FIELDS(PLUS_1) //
ISOLATE_DATA_SUBFIELDS(PLUS_1);
#undef PLUS_1
enum class IsolateFieldId : uint8_t {
#define ENUM(CamelName, ...) k##CamelName,
ISOLATE_DATA_FIELDS(ENUM) //
ISOLATE_DATA_SUBFIELDS(ENUM) //
#undef ENUM
};
} // namespace v8::internal
#endif // V8_EXECUTION_ISOLATE_DATA_FIELDS_H_