[vm] Fix incorrect assumption about co-location of leaf and non-leaf runtime entries in Thread

Thread::OffsetFromThread from runtime_api.cc assumed that all fields
between leaf and non-leaf runtime entries in Thread have word size,
so the delta between runtime entries can be translated from host to
target by multiplying by the ratio between target and host word size.

Since leaf and non-leaf runtime entries are not co-located in Thread,
this assumption is incorrect. It is now fixed by using separate
bases when calculating offsets of leaf and non-leaf runtime entries.

Also, add FatalError runtime entry which is useful for
bootstrapping of the new compiler.

TEST=ci
Issue: https://github.com/dart-lang/sdk/issues/61635
Change-Id: Iea4762b21285aa6423876b34328c863227ee1434
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/467900
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
This commit is contained in:
Alexander Markov
2025-12-15 08:00:53 -08:00
committed by Commit Queue
parent cb2b871706
commit 3c99ae9b68
8 changed files with 1402 additions and 1315 deletions
+104 -95
View File
@@ -175,6 +175,7 @@ base class VMOffsets {
int get SuspendState_pc_offset => throw 'Unknown';
int get SuspendState_then_callback_offset => throw 'Unknown';
int get Thread_AllocateArray_entry_point_offset => throw 'Unknown';
int get Thread_DeoptimizeCopyFrame_entry_point_offset => throw 'Unknown';
int get Thread_active_exception_offset => throw 'Unknown';
int get Thread_active_stacktrace_offset => throw 'Unknown';
int get Thread_array_write_barrier_entry_point_offset => throw 'Unknown';
@@ -880,9 +881,11 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_AllocateArray_entry_point_offset => 0x2e8;
@override
int get Thread_active_exception_offset => 0x6b8;
int get Thread_DeoptimizeCopyFrame_entry_point_offset => 0x700;
@override
int get Thread_active_stacktrace_offset => 0x6c0;
int get Thread_active_exception_offset => 0x6c0;
@override
int get Thread_active_stacktrace_offset => 0x6c8;
@override
int get Thread_array_write_barrier_entry_point_offset => 0x200;
@override
@@ -900,7 +903,7 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_allocate_object_slow_entry_point_offset => 0x230;
@override
int get Thread_api_top_scope_offset => 0x888;
int get Thread_api_top_scope_offset => 0x890;
@override
int get Thread_async_exception_handler_stub_offset => 0x160;
@override
@@ -916,15 +919,15 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_call_to_runtime_stub_offset => 0xd8;
@override
int get Thread_dart_stream_offset => 0x8e0;
int get Thread_dart_stream_offset => 0x8e8;
@override
int get Thread_dispatch_table_array_offset => 0x68;
@override
int get Thread_double_truncate_round_supported_offset => 0x890;
int get Thread_double_truncate_round_supported_offset => 0x898;
@override
int get Thread_service_extension_stream_offset => 0x8e8;
int get Thread_service_extension_stream_offset => 0x8f0;
@override
int get Thread_thread_locals_offset => 0x8f0;
int get Thread_thread_locals_offset => 0x8f8;
@override
int get Thread_optimize_entry_offset => 0x258;
@override
@@ -942,7 +945,7 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_enter_safepoint_stub_offset => 0x1e0;
@override
int get Thread_execution_state_offset => 0x6e0;
int get Thread_execution_state_offset => 0x6e8;
@override
int get Thread_exit_safepoint_stub_offset => 0x1e8;
@override
@@ -962,7 +965,7 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_float_zerow_address_offset => 0x2e0;
@override
int get Thread_global_object_pool_offset => 0x6c8;
int get Thread_global_object_pool_offset => 0x6d0;
@override
int get Thread_interpret_call_entry_point_offset => 0x2a0;
@override
@@ -970,11 +973,11 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_invoke_dart_code_stub_offset => 0xc8;
@override
int get Thread_exit_through_ffi_offset => 0x6f0;
int get Thread_exit_through_ffi_offset => 0x6f8;
@override
int get Thread_isolate_offset => 0x668;
int get Thread_isolate_offset => 0x670;
@override
int get Thread_isolate_group_offset => 0x670;
int get Thread_isolate_group_offset => 0x678;
@override
int get Thread_field_table_values_offset => 0x70;
@override
@@ -984,9 +987,9 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_lazy_specialize_type_test_stub_offset => 0x1d8;
@override
int get Thread_old_marking_stack_block_offset => 0x698;
int get Thread_old_marking_stack_block_offset => 0x6a0;
@override
int get Thread_new_marking_stack_block_offset => 0x6a0;
int get Thread_new_marking_stack_block_offset => 0x6a8;
@override
int get Thread_megamorphic_call_checked_entry_offset => 0x248;
@override
@@ -1042,15 +1045,15 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_resume_interpreter_adjusted_entry_point_offset => 0x280;
@override
int get Thread_resume_pc_offset => 0x6d0;
int get Thread_resume_pc_offset => 0x6d8;
@override
int get Thread_saved_shadow_call_stack_offset => 0x6d8;
int get Thread_saved_shadow_call_stack_offset => 0x6e0;
@override
int get Thread_safepoint_state_offset => 0x6e8;
int get Thread_safepoint_state_offset => 0x6f0;
@override
int get Thread_shared_field_table_values_offset => 0x78;
@override
int get Thread_single_step_offset => 0x8c0;
int get Thread_single_step_offset => 0x8c8;
@override
int get Thread_slow_type_test_stub_offset => 0x1d0;
@override
@@ -1058,9 +1061,9 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_stack_limit_offset => 0x48;
@override
int get Thread_saved_stack_limit_offset => 0x678;
int get Thread_saved_stack_limit_offset => 0x680;
@override
int get Thread_stack_overflow_flags_offset => 0x680;
int get Thread_stack_overflow_flags_offset => 0x688;
@override
int get Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset =>
0x240;
@@ -1072,60 +1075,60 @@ final class Arm64VMOffsets extends VMOffsets {
@override
int get Thread_stack_overflow_shared_without_fpu_regs_stub_offset => 0x188;
@override
int get Thread_store_buffer_block_offset => 0x690;
int get Thread_store_buffer_block_offset => 0x698;
@override
int get Thread_suspend_state_await_entry_point_offset => 0x618;
int get Thread_suspend_state_await_entry_point_offset => 0x620;
@override
int get Thread_suspend_state_await_with_type_check_entry_point_offset =>
0x620;
0x628;
@override
int get Thread_suspend_state_init_async_entry_point_offset => 0x610;
int get Thread_suspend_state_init_async_entry_point_offset => 0x618;
@override
int get Thread_suspend_state_return_async_entry_point_offset => 0x628;
int get Thread_suspend_state_return_async_entry_point_offset => 0x630;
@override
int get Thread_suspend_state_return_async_not_future_entry_point_offset =>
0x630;
0x638;
@override
int get Thread_suspend_state_init_async_star_entry_point_offset => 0x638;
int get Thread_suspend_state_init_async_star_entry_point_offset => 0x640;
@override
int get Thread_suspend_state_yield_async_star_entry_point_offset => 0x640;
int get Thread_suspend_state_yield_async_star_entry_point_offset => 0x648;
@override
int get Thread_suspend_state_return_async_star_entry_point_offset => 0x648;
int get Thread_suspend_state_return_async_star_entry_point_offset => 0x650;
@override
int get Thread_suspend_state_init_sync_star_entry_point_offset => 0x650;
int get Thread_suspend_state_init_sync_star_entry_point_offset => 0x658;
@override
int get Thread_suspend_state_suspend_sync_star_at_start_entry_point_offset =>
0x658;
0x660;
@override
int get Thread_suspend_state_handle_exception_entry_point_offset => 0x660;
int get Thread_suspend_state_handle_exception_entry_point_offset => 0x668;
@override
int get Thread_top_exit_frame_info_offset => 0x688;
int get Thread_top_exit_frame_info_offset => 0x690;
@override
int get Thread_top_offset => 0x58;
@override
int get Thread_top_resource_offset => 0x20;
@override
int get Thread_unboxed_runtime_arg_offset => 0x898;
int get Thread_unboxed_runtime_arg_offset => 0x8a0;
@override
int get Thread_vm_tag_offset => 0x6b0;
int get Thread_vm_tag_offset => 0x6b8;
@override
int get Thread_write_barrier_entry_point_offset => 0x1f8;
@override
int get Thread_write_barrier_mask_offset => 0x50;
@override
int get Thread_next_task_id_offset => 0x8a8;
int get Thread_next_task_id_offset => 0x8b0;
@override
int get Thread_random_offset => 0x8b0;
int get Thread_random_offset => 0x8b8;
@override
int get Thread_jump_to_frame_entry_point_offset => 0x270;
@override
int get Thread_tsan_utils_offset => 0x8b8;
int get Thread_tsan_utils_offset => 0x8c0;
@override
int get Thread_current_tag_offset => 0x8d0;
int get Thread_current_tag_offset => 0x8d8;
@override
int get Thread_default_tag_offset => 0x8d8;
int get Thread_default_tag_offset => 0x8e0;
@override
int get Thread_user_tag_offset => 0x8c8;
int get Thread_user_tag_offset => 0x8d0;
@override
int get TsanUtils_setjmp_function_offset => 0x0;
@override
@@ -1228,7 +1231,6 @@ final class Arm64VMOffsets extends VMOffsets {
List<int> get Code_entry_point_offset => [0x8, 0x18, 0x10, 0x20];
@override
List<int> get Thread_write_barrier_wrappers_thread_offset => [
0x570,
0x578,
0x580,
0x588,
@@ -1243,17 +1245,18 @@ final class Arm64VMOffsets extends VMOffsets {
0x5d0,
0x5d8,
0x5e0,
-1,
-1,
-1,
-1,
0x5e8,
-1,
-1,
-1,
-1,
0x5f0,
-1,
-1,
0x5f8,
-1,
-1,
0x600,
0x608,
0x610,
-1,
-1,
-1,
@@ -1783,9 +1786,11 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_AllocateArray_entry_point_offset => 0x2e8;
@override
int get Thread_active_exception_offset => 0x6b8;
int get Thread_DeoptimizeCopyFrame_entry_point_offset => 0x700;
@override
int get Thread_active_stacktrace_offset => 0x6c0;
int get Thread_active_exception_offset => 0x6c0;
@override
int get Thread_active_stacktrace_offset => 0x6c8;
@override
int get Thread_array_write_barrier_entry_point_offset => 0x200;
@override
@@ -1803,7 +1808,7 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_allocate_object_slow_entry_point_offset => 0x230;
@override
int get Thread_api_top_scope_offset => 0x888;
int get Thread_api_top_scope_offset => 0x890;
@override
int get Thread_async_exception_handler_stub_offset => 0x160;
@override
@@ -1819,15 +1824,15 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_call_to_runtime_stub_offset => 0xd8;
@override
int get Thread_dart_stream_offset => 0x8e0;
int get Thread_dart_stream_offset => 0x8e8;
@override
int get Thread_dispatch_table_array_offset => 0x68;
@override
int get Thread_double_truncate_round_supported_offset => 0x890;
int get Thread_double_truncate_round_supported_offset => 0x898;
@override
int get Thread_service_extension_stream_offset => 0x8e8;
int get Thread_service_extension_stream_offset => 0x8f0;
@override
int get Thread_thread_locals_offset => 0x8f0;
int get Thread_thread_locals_offset => 0x8f8;
@override
int get Thread_optimize_entry_offset => 0x258;
@override
@@ -1845,7 +1850,7 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_enter_safepoint_stub_offset => 0x1e0;
@override
int get Thread_execution_state_offset => 0x6e0;
int get Thread_execution_state_offset => 0x6e8;
@override
int get Thread_exit_safepoint_stub_offset => 0x1e8;
@override
@@ -1865,7 +1870,7 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_float_zerow_address_offset => 0x2e0;
@override
int get Thread_global_object_pool_offset => 0x6c8;
int get Thread_global_object_pool_offset => 0x6d0;
@override
int get Thread_interpret_call_entry_point_offset => 0x2a0;
@override
@@ -1873,11 +1878,11 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_invoke_dart_code_stub_offset => 0xc8;
@override
int get Thread_exit_through_ffi_offset => 0x6f0;
int get Thread_exit_through_ffi_offset => 0x6f8;
@override
int get Thread_isolate_offset => 0x668;
int get Thread_isolate_offset => 0x670;
@override
int get Thread_isolate_group_offset => 0x670;
int get Thread_isolate_group_offset => 0x678;
@override
int get Thread_field_table_values_offset => 0x70;
@override
@@ -1887,9 +1892,9 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_lazy_specialize_type_test_stub_offset => 0x1d8;
@override
int get Thread_old_marking_stack_block_offset => 0x698;
int get Thread_old_marking_stack_block_offset => 0x6a0;
@override
int get Thread_new_marking_stack_block_offset => 0x6a0;
int get Thread_new_marking_stack_block_offset => 0x6a8;
@override
int get Thread_megamorphic_call_checked_entry_offset => 0x248;
@override
@@ -1945,11 +1950,11 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_resume_interpreter_adjusted_entry_point_offset => 0x280;
@override
int get Thread_resume_pc_offset => 0x6d0;
int get Thread_resume_pc_offset => 0x6d8;
@override
int get Thread_saved_shadow_call_stack_offset => 0x6d8;
int get Thread_saved_shadow_call_stack_offset => 0x6e0;
@override
int get Thread_safepoint_state_offset => 0x6e8;
int get Thread_safepoint_state_offset => 0x6f0;
@override
int get Thread_shared_field_table_values_offset => 0x78;
@override
@@ -1959,9 +1964,9 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_stack_limit_offset => 0x48;
@override
int get Thread_saved_stack_limit_offset => 0x678;
int get Thread_saved_stack_limit_offset => 0x680;
@override
int get Thread_stack_overflow_flags_offset => 0x680;
int get Thread_stack_overflow_flags_offset => 0x688;
@override
int get Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset =>
0x240;
@@ -1973,60 +1978,60 @@ final class Arm64ProductVMOffsets extends VMOffsets {
@override
int get Thread_stack_overflow_shared_without_fpu_regs_stub_offset => 0x188;
@override
int get Thread_store_buffer_block_offset => 0x690;
int get Thread_store_buffer_block_offset => 0x698;
@override
int get Thread_suspend_state_await_entry_point_offset => 0x618;
int get Thread_suspend_state_await_entry_point_offset => 0x620;
@override
int get Thread_suspend_state_await_with_type_check_entry_point_offset =>
0x620;
0x628;
@override
int get Thread_suspend_state_init_async_entry_point_offset => 0x610;
int get Thread_suspend_state_init_async_entry_point_offset => 0x618;
@override
int get Thread_suspend_state_return_async_entry_point_offset => 0x628;
int get Thread_suspend_state_return_async_entry_point_offset => 0x630;
@override
int get Thread_suspend_state_return_async_not_future_entry_point_offset =>
0x630;
0x638;
@override
int get Thread_suspend_state_init_async_star_entry_point_offset => 0x638;
int get Thread_suspend_state_init_async_star_entry_point_offset => 0x640;
@override
int get Thread_suspend_state_yield_async_star_entry_point_offset => 0x640;
int get Thread_suspend_state_yield_async_star_entry_point_offset => 0x648;
@override
int get Thread_suspend_state_return_async_star_entry_point_offset => 0x648;
int get Thread_suspend_state_return_async_star_entry_point_offset => 0x650;
@override
int get Thread_suspend_state_init_sync_star_entry_point_offset => 0x650;
int get Thread_suspend_state_init_sync_star_entry_point_offset => 0x658;
@override
int get Thread_suspend_state_suspend_sync_star_at_start_entry_point_offset =>
0x658;
0x660;
@override
int get Thread_suspend_state_handle_exception_entry_point_offset => 0x660;
int get Thread_suspend_state_handle_exception_entry_point_offset => 0x668;
@override
int get Thread_top_exit_frame_info_offset => 0x688;
int get Thread_top_exit_frame_info_offset => 0x690;
@override
int get Thread_top_offset => 0x58;
@override
int get Thread_top_resource_offset => 0x20;
@override
int get Thread_unboxed_runtime_arg_offset => 0x898;
int get Thread_unboxed_runtime_arg_offset => 0x8a0;
@override
int get Thread_vm_tag_offset => 0x6b0;
int get Thread_vm_tag_offset => 0x6b8;
@override
int get Thread_write_barrier_entry_point_offset => 0x1f8;
@override
int get Thread_write_barrier_mask_offset => 0x50;
@override
int get Thread_next_task_id_offset => 0x8a8;
int get Thread_next_task_id_offset => 0x8b0;
@override
int get Thread_random_offset => 0x8b0;
int get Thread_random_offset => 0x8b8;
@override
int get Thread_jump_to_frame_entry_point_offset => 0x270;
@override
int get Thread_tsan_utils_offset => 0x8b8;
int get Thread_tsan_utils_offset => 0x8c0;
@override
int get Thread_current_tag_offset => 0x8d0;
int get Thread_current_tag_offset => 0x8d8;
@override
int get Thread_default_tag_offset => 0x8d8;
int get Thread_default_tag_offset => 0x8e0;
@override
int get Thread_user_tag_offset => 0x8c8;
int get Thread_user_tag_offset => 0x8d0;
@override
int get TsanUtils_setjmp_function_offset => 0x0;
@override
@@ -2129,7 +2134,6 @@ final class Arm64ProductVMOffsets extends VMOffsets {
List<int> get Code_entry_point_offset => [0x8, 0x18, 0x10, 0x20];
@override
List<int> get Thread_write_barrier_wrappers_thread_offset => [
0x570,
0x578,
0x580,
0x588,
@@ -2144,17 +2148,18 @@ final class Arm64ProductVMOffsets extends VMOffsets {
0x5d0,
0x5d8,
0x5e0,
-1,
-1,
-1,
-1,
0x5e8,
-1,
-1,
-1,
-1,
0x5f0,
-1,
-1,
0x5f8,
-1,
-1,
0x600,
0x608,
0x610,
-1,
-1,
-1,
@@ -2577,6 +2582,10 @@ enum RuntimeEntry {
InvokeNoSuchMethod,
ResumeInterpreter,
InitializeSharedField,
FatalError,
}
enum LeafRuntimeEntry {
DeoptimizeCopyFrame,
DeoptimizeFillFrame,
StoreBufferBlockProcess,
+10 -3
View File
@@ -953,9 +953,16 @@ word Thread::OffsetFromThread(const dart::Object& object) {
intptr_t Thread::OffsetFromThread(const dart::RuntimeEntry* runtime_entry) {
auto host_offset = dart::Thread::OffsetFromThread(runtime_entry);
return AllocateArray_entry_point_offset() +
TranslateOffsetInWords(
host_offset - dart::Thread::AllocateArray_entry_point_offset());
if (runtime_entry->is_leaf()) {
return DeoptimizeCopyFrame_entry_point_offset() +
TranslateOffsetInWords(
host_offset -
dart::Thread::DeoptimizeCopyFrame_entry_point_offset());
} else {
return AllocateArray_entry_point_offset() +
TranslateOffsetInWords(
host_offset - dart::Thread::AllocateArray_entry_point_offset());
}
}
bool CanLoadFromThread(const dart::Object& object,
+1
View File
@@ -1216,6 +1216,7 @@ class Thread : public AllStatic {
static word jump_to_frame_entry_point_offset();
static word AllocateArray_entry_point_offset();
static word DeoptimizeCopyFrame_entry_point_offset();
static word write_barrier_code_offset();
static word array_write_barrier_code_offset();
static word fix_callers_target_code_offset();
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -233,6 +233,7 @@
FIELD(SuspendState, pc_offset) \
FIELD(SuspendState, then_callback_offset) \
FIELD(Thread, AllocateArray_entry_point_offset) \
FIELD(Thread, DeoptimizeCopyFrame_entry_point_offset) \
FIELD(Thread, active_exception_offset) \
FIELD(Thread, active_stacktrace_offset) \
FIELD(Thread, array_write_barrier_entry_point_offset) \
@@ -497,7 +498,8 @@
PAYLOAD_SIZEOF(SuspendState, InstanceSize, HeaderSize) \
PAYLOAD_SIZEOF(TypedData, InstanceSize, HeaderSize) \
ENUM(StubCode, StubCode::StubNames) \
ENUM(RuntimeEntry, RuntimeEntry::RuntimeEntryNames)
ENUM(RuntimeEntry, RuntimeEntry::RuntimeEntryNames) \
ENUM(LeafRuntimeEntry, RuntimeEntry::LeafRuntimeEntryNames)
#define JIT_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, ARRAY_SIZEOF, PAYLOAD_SIZEOF, \
RANGE, CONSTANT, ENUM) \
+5
View File
@@ -4927,6 +4927,11 @@ DEFINE_RUNTIME_ENTRY(ResumeInterpreter, 3) {
#endif // defined(DART_DYNAMIC_MODULES)
}
DEFINE_RUNTIME_ENTRY(FatalError, 1) {
const String& message = String::CheckedHandle(zone, arguments.ArgAt(0));
FATAL("%s", message.ToCString());
}
extern "C" void DLRT_EnterSafepoint() {
CHECK_STACK_ALIGNMENT;
TRACE_RUNTIME_CALL("%s", "EnterSafepoint");
+4 -2
View File
@@ -60,10 +60,12 @@ class RuntimeEntry : public BaseRuntimeEntry {
static constexpr const char* RuntimeEntryNames[] = {
#define RUNTIME_ENTRY_NAME(name) #name,
#define LEAF_RUNTIME_ENTRY_NAME(type, name, ...) #name,
RUNTIME_ENTRY_LIST(RUNTIME_ENTRY_NAME)
LEAF_RUNTIME_ENTRY_LIST(LEAF_RUNTIME_ENTRY_NAME)
#undef RUNTIME_ENTRY_NAME
};
static constexpr const char* LeafRuntimeEntryNames[] = {
#define LEAF_RUNTIME_ENTRY_NAME(type, name, ...) #name,
LEAF_RUNTIME_ENTRY_LIST(LEAF_RUNTIME_ENTRY_NAME)
#undef LEAF_RUNTIME_ENTRY_NAME
};
+2 -1
View File
@@ -88,7 +88,8 @@ namespace dart {
V(InterpretedInstanceCallMissHandler) \
V(InvokeNoSuchMethod) \
V(ResumeInterpreter) \
V(InitializeSharedField)
V(InitializeSharedField) \
V(FatalError)
// Note: Leaf runtime function have C linkage, so they cannot pass C++ struct
// values like ObjectPtr.