dart-sdk/sdk/lib
Daco Harkes 0bcb0c934d [vm/ffi] Add _Compound _offsetInBytes field
This CL changes compounds (structs, unions, and arrays) to be backed
by a TypedDataBase and an int offset.

Before this CL, the compounds where only backed by a TypedDataBase.
This leads to the following issues:

1. Access to nested structs required code for allocating new typed data
   views or pointers, which the optimizer then had to prevent from
   being allocated after inlining.
2. Runtime branching on whether the TypedDataBase was a Pointer or
   TypedData increased code size and prevented inlining.
   https://github.com/dart-lang/sdk/issues/54892
   This could not be properly optimized if in AOT both typed
   data and pointer were flowing into the same compound.
3. Constructing TypedData views required calculating the length of the
   view.

After this CL, accessing nested compounds will lead to accesses on the
original TypedDataBase with an extra offset.

This removes the polymorphism on TypedData vs Pointer, because the
final int/float/Pointer accesses in nested compounds operate on
TypedDataBase.

Also, it simplifies creating an `offsetBy` accessor, because it will
no longer have to be polymorphic in typed data vs pointer, nor will it
have to calculate the length of the field.

Implementation details:

* The changes in the CFE and patch files are straightforward.
* VM: Struct-by-value returns (or callback params) are initialized
  with an offsetInBytes of 0.
* VM: Struct-by-value arguments (and callback return) need to read out
  the offsetInBytes. Before this CL we were passing in the TypedData
  as tagged value. With this CL we are passing the TypedData as tagged
  value and the offset as unboxed int, from 1 IL input to 2 IL
  inputs. (The alternative would have been to take the compound as
  a tagged value, but that would have prevented optimizations from not
  allocating the compound object in the optimizer.
  The FfiCallInstr is updated to have two definitions for the case
  where we were passing in the TypedData previously.
  The NativeReturnInstr is refactored to be able to take two inputs
  instead of 1. (Note that we don't have VariadicInstr only
  VariadicDefinition in the code base. So the instruction is _not_
  implemented as variadic, rather as having a fixed length of 2.)
* dart2wasm does no longer support nested compounds due to the
  compound implementation only storing a pointer address.
  https://github.com/dart-lang/sdk/issues/55083

Intending to land this after
https://dart-review.googlesource.com/c/sdk/+/353101.

TEST=test/ffi

CoreLibraryReviewExempt: VM and WASM-only implementation change.
Closes: https://github.com/dart-lang/sdk/issues/54892
Bug: https://github.com/dart-lang/sdk/issues/44589
Change-Id: I8749e21094bf8fa2d5ff1e48b6b002c375232eb5
Cq-Include-Trybots: dart-internal/g3.dart-internal.try:g3-cbuild-try
Cq-Include-Trybots: 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-x64-try,vm-aot-win-debug-x64c-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-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/+/354226
Reviewed-by: Tess Strickland <sstrickl@google.com>
2024-03-26 17:14:13 +00:00
..
_http [dart:developer][VM/Service] Add APIs to dart:developer for recording HTTP profiling information, and for later retrieving that information 2024-02-15 18:56:08 +00:00
_internal [vm/ffi] Add _Compound _offsetInBytes field 2024-03-26 17:14:13 +00:00
_wasm [dart2wasm] Refactor and optimize dart2wasm hash map/set types 2024-03-05 16:00:39 +00:00
async Expand docs around error zones 2024-02-29 01:49:08 +00:00
cli [vm] Remove dart:cli from dartdoc 2024-02-29 13:57:27 +00:00
collection [collection] Update example code in dartdoc 2023-12-28 23:37:27 +00:00
convert Remove Utf8Decoder._convertIntercepted hook 2023-11-23 12:25:26 +00:00
core Fix bug in Uri.resolve with IPv6 addresses. 2024-03-11 14:48:24 +00:00
developer [dart:developer][VM/Service] Add APIs to dart:developer for recording HTTP profiling information, and for later retrieving that information 2024-02-15 18:56:08 +00:00
ffi [vm/ffi] Add _Compound _offsetInBytes field 2024-03-26 17:14:13 +00:00
html [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
indexed_db [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
internal [sdk/lib] Update SystemHash.smear for improved parameters 2024-02-15 15:06:58 +00:00
io Revert "[io] Fix a bug where Process.stdin.add exceptions could not be caught" 2024-03-25 21:03:12 +00:00
isolate Refer to unnamed constructors in doc comments with '.new' 2023-10-17 14:42:38 +00:00
js Update JSExport docs to refer to createJSInteropWrapper 2024-02-14 00:36:25 +00:00
js_interop [dart:js_interop] Add ExternalDartReference 2024-03-26 15:43:19 +00:00
js_interop_unsafe [dart:js_interop/_unsafe] Clean up API docs 2024-02-29 04:15:49 +00:00
js_util [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
math [sdk/math] Mark Point, Rectangle, and MutableRectangle as legacy 2024-02-14 18:35:17 +00:00
mirrors [vm] Add minimal support for mirrors of extension type members 2023-12-07 21:48:50 +00:00
svg [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
typed_data Reapply "[typed_data] Deprecate unmodifiable views" 2024-02-06 23:30:49 +00:00
vmservice [VM / vmservice] Run service isolate in sound null safe mode (JIT) 2024-03-13 17:56:49 +00:00
web_audio [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
web_gl [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
web_sql [docs] update dart:html template files 2024-01-12 18:17:13 +00:00
libraries.json revert dart:_macros, going with SDK vendored package 2024-03-21 02:40:58 +00:00
libraries.yaml revert dart:_macros, going with SDK vendored package 2024-03-21 02:40:58 +00:00
PRESUBMIT.py [build] Python 3.12 compatibility. 2023-12-12 18:19:35 +00:00
vmservice_libraries.json [Core Libraries] Eliminate the fork in the core libraries. 2020-06-16 23:37:36 +00:00
vmservice_libraries.yaml update the tooling to generate libraries.json from libraries.yaml 2021-07-27 23:02:50 +00:00