diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc index 0249f049578..2b871c754ac 100644 --- a/runtime/vm/compiler/stub_code_compiler_arm64.cc +++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc @@ -510,7 +510,7 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { // We exit the safepoint inside DLRT_GetFfiCallbackMetadata in order to save // code size on this shared stub. { - __ mov(SP, CSP); + __ SetupDartSP(); __ EnterFrame(0); __ PushRegisters(all_registers); @@ -531,8 +531,6 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { __ EnterFrame(0); __ ReserveAlignedFrameSpace(0); - __ mov(CSP, SP); - #if defined(DART_TARGET_OS_FUCHSIA) // TODO(https://dartbug.com/52579): Remove. if (FLAG_precompiled_mode) { @@ -549,7 +547,9 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { FfiCallbackMetadata::kGetFfiCallbackMetadata, R4); #endif // defined(DART_TARGET_OS_FUCHSIA) + __ mov(CSP, SP); __ blr(R4); + __ mov(SP, CSP); __ mov(THR, R0); __ LeaveFrame(); @@ -564,7 +564,7 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { __ PopRegisters(all_registers); __ LeaveFrame(); - __ mov(CSP, SP); + __ RestoreCSP(); } Label async_callback; @@ -605,7 +605,7 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { // Exit the temporary isolate. { - __ mov(SP, CSP); + __ SetupDartSP(); __ EnterFrame(0); __ ReserveAlignedFrameSpace(0); @@ -631,7 +631,7 @@ void StubCodeCompiler::GenerateFfiCallbackTrampolineStub() { __ mov(THR, R0); __ LeaveFrame(); - __ mov(CSP, SP); + __ RestoreCSP(); } __ Bind(&done); diff --git a/runtime/vm/ffi_callback_metadata.h b/runtime/vm/ffi_callback_metadata.h index 9269321c382..1565a1d20d9 100644 --- a/runtime/vm/ffi_callback_metadata.h +++ b/runtime/vm/ffi_callback_metadata.h @@ -242,7 +242,7 @@ class FfiCallbackMetadata { static constexpr intptr_t kNativeCallbackTrampolineStackDelta = 4; #elif defined(TARGET_ARCH_ARM64) static constexpr intptr_t kNativeCallbackTrampolineSize = 8; - static constexpr intptr_t kNativeCallbackSharedStubSize = 320; + static constexpr intptr_t kNativeCallbackSharedStubSize = 332; static constexpr intptr_t kNativeCallbackTrampolineStackDelta = 2; #elif defined(TARGET_ARCH_RISCV32) static constexpr intptr_t kNativeCallbackTrampolineSize = 8; diff --git a/tests/ffi/function_callbacks_test.dart b/tests/ffi/function_callbacks_test.dart index a085e58272d..f71ccfe0d71 100644 --- a/tests/ffi/function_callbacks_test.dart +++ b/tests/ffi/function_callbacks_test.dart @@ -13,6 +13,7 @@ // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code --stacktrace-every=100 // VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects // VMOptions=--test_il_serialization +// VMOptions=--profiler // SharedObjects=ffi_test_functions import 'dart:ffi';