dart-sdk/runtime/lib
Daco Harkes e16bb210d2 [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=runtime/vm/compiler/backend/il_test.cc
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
Closes: https://github.com/dart-lang/sdk/issues/51618
Change-Id: Ic5d017005dedcedea40c455c4d24dbe774f91603
CoreLibraryReviewExempt: Internal FFI implementation changes
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-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/+/284300
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2023-11-02 16:00:53 +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 [vm/ffi] Optimize @Native calls 2023-11-02 16:00:53 +00:00
ffi_dynamic_library.h [vm/ffi] Optimize @Native calls 2023-11-02 16:00:53 +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