dart-sdk/runtime/lib
Daco Harkes 47357d8535 Reland "[vm/ffi] Optimize @Native calls"
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>
2023-11-22 16:13:42 +00:00
..
array.cc Spelling pkg dev compiler 2023-01-26 09:12:41 +00:00
async.cc [vm] Remove old async_debugger flag. 2023-06-27 07:18:50 +00:00
async_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
bool.cc [vm] Make naming more consistent when converting between handles, tagged and untagged pointers. 2021-01-15 23:32:02 +00:00
convert_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00
core_sources.gni [vm] Remove dead runtime entries for WeakProperty 2022-01-18 19:15:25 +00:00
date.cc [vm] Remove dead _localTimeZoneAdjustmentInSeconds. 2022-07-19 17:29:04 +00:00
developer.cc [dart:developer] Add static Service.getObjectId method 2023-08-04 14:18:38 +00:00
developer_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
double.cc [build] Include FPESAN in UBSAN. 2023-09-21 15:16:39 +00:00
errors.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
ffi.cc [vm/ffi] Closure callbacks for sync callbacks 2023-08-25 03:35:44 +00:00
ffi_dynamic_library.cc Reland "[vm/ffi] Optimize @Native calls" 2023-11-22 16:13:42 +00:00
ffi_dynamic_library.h Reland "[vm/ffi] Optimize @Native calls" 2023-11-22 16:13:42 +00:00
ffi_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
function.cc [vm] Fix equality of uninstantiated generic closures 2023-03-08 21:44:56 +00:00
growable_array.cc Revert part of "[vm] Allow sharing of deeply immutable lists across isolates" 2023-02-10 20:25:59 +00:00
identical.cc [vm] Make naming more consistent when converting between handles, tagged and untagged pointers. 2021-01-15 23:32:02 +00:00
integers.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
integers.h [vm] Better implementation of hashCode function. 2022-10-20 20:31:20 +00:00
invocation_mirror.h Revert "Revert "Dart Core Lib change to support generic functions in class NoSuchMethodError."" 2017-09-28 00:27:24 +00:00
isolate.cc [vm] Cleanup lookups in the library import 2023-08-30 17:18:53 +00:00
isolate_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
libgen_in.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
math.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
math_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
mirrors.cc [vm] Cleanup [PatchClass] in the VM 2023-06-29 15:03:37 +00:00
mirrors.h [VM] Implement isExtensionMember in MethodMirror and VariableMirror 2019-10-09 00:27:30 +00:00
mirrors_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
object.cc Reland "Reland "[vm] Unify hash codes in type objects"" 2023-05-26 20:13:17 +00:00
profiler.cc [ VM / Service ] Add UserTag support to C-API and send UserTagChanged 2021-06-23 00:58:47 +00:00
profiler_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00
regexp.cc [vm/regexp] Name generated Regexp function with actual expression. 2023-03-09 03:49:58 +00:00
simd128.cc [build] Include FPESAN in UBSAN. 2023-09-21 15:16:39 +00:00
stacktrace.cc [vm] Rework awaiter stack unwinding. 2023-06-30 14:03:03 +00:00
stacktrace.h Reland "[ Service / dart:isolate ] Added getPorts RPC and 'debugName' optional" 2020-10-29 02:52:03 +00:00
stopwatch.cc [vm] refactor native entry and native entry type arguments 2018-12-13 19:29:26 +00:00
string.cc [vm] Update to constexpr in runtime/platform and lib. 2023-04-11 17:43:58 +00:00
timeline.cc [VM/Timeline] Store an array of flow IDs in each dart::TimelineEvent 2023-05-26 13:08:27 +00:00
typed_data.cc Reland "[vm/compiler] Change MemoryCopy to also take untagged addresses." 2023-10-17 07:41:49 +00:00
typed_data_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
uri.cc [vm] Reland: Prefix HOST_OS_* and TARGET_OS_* with DART_ 2021-07-02 19:06:45 +00:00
vmservice.cc [vm] Disentagle PortMap/MessageHandler from port status tracking 2023-08-08 10:57:47 +00:00
vmservice_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00