From 7d23f323898d3ed4a0ff47d1237a3fba22942b38 Mon Sep 17 00:00:00 2001 From: Ryan Macnak Date: Wed, 23 Aug 2023 00:17:02 +0000 Subject: [PATCH] [vm, compiler] Kick CSP ahead of SP in FFI callback stub. TEST=profiler Bug: https://github.com/dart-lang/sdk/issues/53303 Change-Id: Id73046f91c52e39e675c89797e8896ba09d4baa6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/322200 Commit-Queue: Ryan Macnak Reviewed-by: Liam Appelbe --- runtime/vm/compiler/stub_code_compiler_arm64.cc | 12 ++++++------ runtime/vm/ffi_callback_metadata.h | 2 +- tests/ffi/function_callbacks_test.dart | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) 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';