mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 22:51:29 +00:00
47357d8535
Original change in patchset 1. The reland contains a fix for handles. The objects passed in handles must live on the stack (or in the heap) so that that memory location can be used as a handle. This CL introduces a new allocation policy `RequiresRegister` which forces constants to be spilled to the stack during register allocation. Note: Parameters to FfiCall instructions are currently not used in a way that can make the parameters assigned to registers. So only constants are treated currently. If we have a way to reproduce params being assigned to registers, then we can force spilling for non-consts as well in the register allocator. Original change's description: > [vm/ffi] Optimize `@Native` calls > > This CL removes static fields for storing the `@Native`'s function > addresses. Instead, the function addresses are stored in the object > pool for all archs except for ia32. ia32 has no AOT and no AppJit > snapshots, so the addresses are directly embedded in the code. > > This CL removes the closure wrapping for `@Native`s. Instead of > `pointer.asFunctionInternal()()` where `asFunction` returns a closure > which contains the trampoline, the function is compiled to a body > which contains the trampoline `Native()`. This is possible for > `@Native`s because the dylib and symbol names are known statically. > > Doing the compilation in kernel_to_il instead of a CFE transform > enables supporting static linking later. (The alternative would have > been to transform in the cfe to a `@pragma('vm:cachable-idempotent')` > instead of constructing the IL in kernel_to_il. > > To enable running resolution in ia32 in kernel_to_il.cc, the > resolution function has been made available via > `runtime/lib/ffi_dynamic_library.h`. > > Because the new calls are simply static calls, the TFA can figure > out const arguments flowing to these calls. This leads to constant > locations in the parameters to FfiCalls. So, this CL also introduces > logic to move constants into `NativeLocation`s. TEST=tests/ffi/vmspecific_ffi_native_handles_test.dart TEST=tests/ffi/function_*_native_(leaf_)test.dart TEST=pkg/vm/testcases/transformations/ffi/ffinative_compound_return.dart Closes: https://github.com/dart-lang/sdk/issues/47625 CoreLibraryReviewExempt: Internal FFI implementation changes Change-Id: Ia1401b335524dcbf50c663a8770d9a02802923df Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64c-try,vm-aot-win-release-x64-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-precomp-linux-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/333841 Reviewed-by: Slava Egorov <vegorov@google.com> |
||
---|---|---|
.. | ||
array.cc | ||
async.cc | ||
async_sources.gni | ||
bool.cc | ||
convert_sources.gni | ||
core_sources.gni | ||
date.cc | ||
developer.cc | ||
developer_sources.gni | ||
double.cc | ||
errors.cc | ||
ffi.cc | ||
ffi_dynamic_library.cc | ||
ffi_dynamic_library.h | ||
ffi_sources.gni | ||
function.cc | ||
growable_array.cc | ||
identical.cc | ||
integers.cc | ||
integers.h | ||
invocation_mirror.h | ||
isolate.cc | ||
isolate_sources.gni | ||
libgen_in.cc | ||
math.cc | ||
math_sources.gni | ||
mirrors.cc | ||
mirrors.h | ||
mirrors_sources.gni | ||
object.cc | ||
profiler.cc | ||
profiler_sources.gni | ||
regexp.cc | ||
simd128.cc | ||
stacktrace.cc | ||
stacktrace.h | ||
stopwatch.cc | ||
string.cc | ||
timeline.cc | ||
typed_data.cc | ||
typed_data_sources.gni | ||
uri.cc | ||
vmservice.cc | ||
vmservice_sources.gni |