e3e82c95cb3782515e5775bd8da170fd6771a723
130 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
50e0e0d99d |
[vm/shared] Introduce NativeCallable.isolateGroupShared
This method allows for synchronous execution of dart callbacks from native code. The execution happens on dart mutator thread, from which dart code can only access isolate-group variables - those which are tagged with . Bug: https://github.com/dart-lang/sdk/issues/54530 Bug: https://github.com/dart-lang/sdk/issues/56841 Change-Id: Ia1a6b01327be493f003f1eea82e558bb6b147dd3 CoreLibraryReviewExempt: only internal library change TEST=isolate_group_shared_callback_test Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422920 Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Alexander Aprelev <aam@google.com> |
||
|
|
f04f534507 |
[vm] Make FFI implementation less fragile wrt field order
Replace access of certain fields by hardcoded indices with lookup by name. As number of fields in those classes is small, the lookup should not take considerable time. This fix is done in anticipation for the CFE change https://dart-review.googlesource.com/c/sdk/+/412880 which may change order of declared fields if there are patches. TEST=manually tested with CFE change Change-Id: Ibf4ab6719ee263711fb7c6b21b038ea1dc5f9e7b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412803 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> |
||
|
|
bb483f34a3 |
[vm/ffi] Allow configuring the variable dimension of variable-length arrays
TEST=tests/ffi/* CoreLibraryReviewExempt: VM only Closes: https://github.com/dart-lang/sdk/issues/52366 Change-Id: I545a323f48d955b591cedf2dae7106d9004242e2 Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-asan-linux-release-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-msan-linux-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-aot-ubsan-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-arm64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-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-arm64-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-arm64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-tsan-linux-release-arm64-try,vm-tsan-linux-release-x64-try,vm-ubsan-linux-release-arm64-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/+/398621 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> |
||
|
|
84fd647969 |
[vm] Refactor access to Integer value
Add methods to provide uniform access to values of Dart integers: Integer::Value() Integer::Value(IntegerPtr) Smi::Value() Smi::Value(SmiPtr) Mint::Value() Mint::Value(MintPtr) Remove AsInt64Value() AsTruncatedInt64Value() AsTruncatedUint32Value() GetInt64Value(IntegerPtr) Also, rename AsDoubleValue() to ToDouble() and remove unused (FitsIntoSmi, AsValidInteger) and value-based methods (IsZero, IsNegative). TEST=ci Change-Id: I28786ec3a14703574b7a192ead42eeefdbd09106 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380586 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> |
||
|
|
4b66657b98 |
[vm/ffi] address of operator for FFI leaf calls
During FFI leaf calls, the Dart GC will not run. This means that we can pass pointers into `TypedData` to FFI calls that take `Pointer` arguments. After this CL, we have three types of arguments that can flow into `Pointer` argument in an FFI call: * `Pointer`. * `TypedData`: Any typed data including views. * `_Compound`: A TypedData/Pointer and an offset in bytes. The is only possible for `@Native external` functions, `asFunction` does not support passing in `TypedData`. (See related GitHub issues for discussion. TLDR: FFIgen should generate bindings without config.) `.address` expressions on `TypedData` and `Array` elements do _not_ introduce bounds checks, even though `TypedData` and `Array` have bounds information. E.g. `ffiNative(Uint8List(10)[20].address)` does not throw. Implementation details: The CFE analyzes call-sites to `@Native external` functions. If the arguments are `.address` expressions, it transforms the call site to pass the compound or `TypedData`. If an additional offset needs to be applied, the CFE constructs a new `_Compound` with the correct offset in bytes. The CFE then also creates a new `@Native external` function which have `TypedData`s and `_Compound`s parameters. To avoid name clashes, these functions are postfixed with `#` and `P`, `T`, or `C` for each Pointer parameter. TEST=pkg/vm/testcases/transformations/ffi/address_of_* In the VM, `TypedData` arguments are passed as tagged values, and the address is loaded inside the `FfiCallInstr`. `_Compound` arguments turn into two IL definitions, one for the `TypedDataBase` (tagged), and one for the offset in bytes (unboxed). The address is then loaded inside the `FfiCallInstr` and the offset in bytes is applied. Adding the offset in bytes required an extra temp register for ia32. Also, it uncovered that the temp register in arm32 was conflicting with the argument registers. However, TMP should suffice instead. TEST=tests/ffi/address_of_array_generated_test.dart TEST=tests/ffi/address_of_struct_generated_test.dart TEST=tests/ffi/address_of_typeddata_generated_test.dart Closes: https://github.com/dart-lang/sdk/issues/44589 Closes: https://github.com/dart-lang/sdk/issues/54771 CoreLibraryReviewExempt: VM only, unsupported in dart2wasm Change-Id: I01fb428cfd6f9096a34689c2819c124a8003cb6b 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-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-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-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/+/360882 Reviewed-by: Jens Johansen <jensj@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> |
||
|
|
f98a2138b7 |
[vm] Run clang-format on code base
When uploading CLs, the presubmit checks verify that the lines in the diff are formatted correctly according to `git cl format runtime`. However, when `buildtools/<os>-<arch>/clang/bin/clang-format` is updated, it does not force reformatting of files that would be reformatted. This leads to two issues: * Inconsistent style within the code base and within a single file. * Spurious reformatting in CLs when (1) clang-format is used on the whole file, or (2) the diff lines overlap. `clang-format` doesn't change that frequently, so in general this is not a large issue, but I've seen a bit too many "spurious formatting, please revert" comments on CLs recently. This CL formats the runtime to be in line with the current pinned `clang-format`: ``` $ find runtime/ -iname *.h -o -iname *.cc | xargs buildtools/mac-arm64/clang/bin/clang-format -i ``` `git cl format` (which only formats changed lines, and does so with `clang-format`) seems to not agree with itself, or clang-format, or cpplint in a handful of places. This CL adds `// clang-format off` for these. (See previous patchsets for the specific instances.) TEST=A variety of bots including GCC, MacOS and Windows. Change-Id: I470892e898971899fda14bb3b8f2c8efefd67686 Cq-Include-Trybots: luci.dart.try:vm-gcc-linux-try,vm-ffi-qemu-linux-release-riscv64-try,vm-ffi-qemu-linux-release-arm-try,vm-aot-win-debug-x64-try,vm-win-debug-x64c-try,vm-mac-debug-x64-try,vm-mac-debug-arm64-try,vm-aot-linux-debug-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/362780 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> |
||
|
|
c0b938c228 |
[vm/ffi] Fix variadic arguments on MacOS Arm64
Non-variadic arguments on the stack on MacOS Arm64 are aligned to the value size (which can be smaller than word size). However, for varargs, the arguments on the stack seem to be aligned to the word size. This CL introduces an alignment strategy constant for primitives on the stack in varargs and uses it in the native calling convention calculation. TEST=runtime/vm/compiler/ffi/native_calling_convention_test.cc with runtime/vm/compiler/ffi/unit_tests/variadic_less_than_word/arm64_macos.expect TEST=tests/ffi/function_varargs_generated_native_leaf_test.dart Closes: https://github.com/dart-lang/sdk/issues/55471 Change-Id: I51d20c3933a2cea9b110954ddec92fb91b9c3ecd Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-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/+/362762 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com> |
||
|
|
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> |
||
|
|
1cebdcb2da |
[vm/ffi] Use untagged pointer representations for FFI pointers.
Previously, the FFI used unboxed integers as a native representation for pointers in FFI code, as the compiler only handled very specific uses of untagged pointers flowing between instructions. Since then, this restriction has been removed for untagged pointers that do not point to memory managed by the GC, like FFI pointers, so now they can have a more precise representation. By being precise about when untagged (untagged pointers to freshly allocated Handles and the contents of Pointer data fields) and tagged (TypedData objects constructed to hold the byte representation of compound data) values are expected, we can remove the need to have untagged pointers to GC-movable objects and/or having untagged pointers escape as unboxed integers in the generated IL. This CL also renames kUnboxedFfiIntPtr -> kUnboxedAddress and limits its uses specifically to where the unboxed integer represents the numeric representation of an untagged pointer. This CL changes CCall to take Representations for the arguments and return value instead of what looks like an arbitrary NativeCallingConvention. However, the serializer and deserializers for CCall, used in IL tests, originally assumed that the argument and return representations were kUnboxedFfiIntPtr, so providing an arbitrary NativeCallingConvention which didn't match that assumption would cause failures during IL tests. That assumption came from the fact that the only creator of CCall instructions was in kernel_to_il.cc, and there that was the case. Now CCall builds the native calling convention during construction and deserialization from the argument and return representations and stores both the representations and built native calling convention internally. In the future, if we want to create CCall instructions with more arbitrary native calling conventions, then we'll need to handle serialization/deserialization of arbitrary native calling conventions, and also add consistency checks that the provided representations appropriately match the native calling convention. TEST=ffi vm/dart/regress_306327173_il vm/dart/address_local_pointer_il Issue: https://github.com/dart-lang/sdk/issues/54710 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-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-release-ia32-try Change-Id: I34effe8fbdc80288b703e0152d5ba67ce2343400 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/353101 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> |
||
|
|
70e4ff3e1a |
Revert "[vm/ffi] Unwrap typed data in FFI calls"
This reverts: https://dart-review.googlesource.com/c/sdk/+/338620 We'd like to support this use case with a different API. See the discussion in https://github.com/dart-lang/sdk/issues/54739. TEST=tests/ffi Bug: https://github.com/dart-lang/sdk/issues/44589 Bug: https://github.com/dart-lang/sdk/issues/54771 Change-Id: Ic22fbcab14d374bb9c81bba1f1bf6ae2dfc9e674 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/+/349340 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> |
||
|
|
dcdfcc2b8d |
Reland "[vm/ffi] Express FFI call closures explicitly in AST"
This reverts commit |
||
|
|
1800039c2a |
Revert "[vm/ffi] Express FFI call closures explicitly in AST"
This reverts commit |
||
|
|
c20f9eaf6f |
[vm/ffi] Cleanup FFI call trampolines
After [1], FFI call sequence is generated inside a Dart closure function and separate FFI call trampolines are no longer used. This change removes all code related to FFI call trampolines. [1] https://dart-review.googlesource.com/c/sdk/+/339662 TEST=existing Change-Id: I0af0be6441009fb4db885ee172b0487f4796fd18 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340302 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
40094c8cfd |
[vm/ffi] Unwrap typed data in FFI calls
Enables passing inner pointers to typed data in FFI leaf calls. This works for typed data's in the Dart heap, external typed datas (constructed from `Pointer.asTypedList`), and typed data views. Notable implementation details: 1. The Dart signature is used in the Marshaller now. This means it needs to keep track of whether there's a pointer argument in the signature (`asFunction`) or not (`@Native`). 2. Unwrapping is done in `FfiCallInstr::EmitNativeCode` before moving the arguments to their native location. This ensures we can use the assembler logic to load the `TypedDataBase::data` field. 3. The `XXXList` user visible classes don't have predefined cids. So the implementation uses symbols for comparison. 4. The type checking logic takes `isLeaf` as input to reject typed data. This leads to an error message about the type not accepted. Alternatively, we could consider adding an error message that specifically says the function should be leaf. 5. To cover all calling convention variants, tests are generated with up to 20 arguments. TEST=pkg/analyzer/test/src/diagnostics/ffi_unwrap_typed_data_test.dart TEST=tests/ffi/unwrap_typeddata_generated_native_test.dart TEST=tests/ffi/unwrap_typeddata_generated_test.dart TEST=tests/ffi/vmspecific_static_checks_typeddata_test.dart Closes: https://github.com/dart-lang/sdk/issues/44589 Change-Id: Ia78f18bf3238d42ac6882929b441f6dc432fcefe 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/+/338620 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> |
||
|
|
d229aa0edd |
[vm, ffi] Extend stack slots to word size for RISC-V.
Clang relies on this, gcc does not. TEST=ci Change-Id: Iee14790367f6807abd222f69990640d44e6f1f77 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339081 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
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>
|
||
|
|
c5c578e671 |
[vm, ffi] Don't read out-of-bounds when marshalling structs by value.
Switch the Windows ARM64 builds to use MSVC. Clang disagrees with itself about handling of small structs in variadic functions, allowing splitting between the last argument register and the stack as the callee but not as the caller. TEST=ci Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-release-arm-try,vm-ffi-android-release-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-linux-release-arm64-try,vm-mac-debug-arm64-try,vm-mac-release-arm64-try,vm-win-debug-arm64-try,vm-win-release-arm64-try,vm-ffi-qemu-linux-release-riscv64-try,vm-linux-debug-ia32-try,vm-linux-release-ia32-try,vm-win-release-ia32-try,vm-linux-debug-x64-try,vm-linux-release-x64-try,vm-mac-debug-x64-try,vm-mac-release-x64-try,vm-win-debug-x64-try,vm-win-release-x64-try Bug: https://github.com/dart-lang/sdk/issues/52644 Bug: https://github.com/dart-lang/sdk/issues/53829 Change-Id: I2fd6c40620a885479f11bb8528ca1e9df3948a2f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331209 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> |
||
|
|
96921245f9 |
Revert "[vm/ffi] Optimize @Native calls"
This reverts commit
|
||
|
|
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>
|
||
|
|
df70dbbf8b |
[vm/ffi] Improve backend error messages
TEST=test/ffi Change-Id: Ie2b855fa76709d77706b4f0d5d8d5ebb11f267f2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/332685 Reviewed-by: Tess Strickland <sstrickl@google.com> Auto-Submit: Daco Harkes <dacoharkes@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> |
||
|
|
c0a936868b |
[vm, ffi] Round up checking for registers for small structs.
This fixes an edge case on all ARM64 ABIs, when there is only one argument register remaining and the next argument is a 9-16 byte struct. TEST=ci Bug: https://github.com/dart-lang/sdk/issues/52644 Change-Id: I40d962e6d1b3484dbfcf91f5d6baca0bfec76056 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330161 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
7369dcb401 |
[vm, ffi] Add tests related to small structs.
TEST=ci Change-Id: Ib39ce80bb149db488fb7e9ea0e44f7e5da57f205 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330481 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
785f4d649e |
[vm, ffi] Windows ARM64 varargs.
- Don't use float registers - Even for the fixed arguments before the variable arguments - These changes apply only to the arguments not the result TEST=ci Bug: https://github.com/dart-lang/sdk/issues/52644 Change-Id: Ifa600a929f9a54b44e78a6f15eafe1cee7141466 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329803 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
985c292cff |
[vm, ffi] Add Windows ARM64 to FFI unit tests.
This accepts the current results, including known bugs in handling of variadic arguments. Fixes are in a follow-up CL. TEST=ci Change-Id: I6a0bd11aeb1fe0a6980dd6ff974dc5a4b207fb97 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329824 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
e8d7425c4e |
[vm/ffi] Closure callbacks for sync callbacks
Bug: https://github.com/dart-lang/sdk/issues/52689 Change-Id: I54be397cfbf8519fe5b5a51b793fe46d602124d9 Fixes: https://github.com/dart-lang/sdk/issues/52689 Bug: https://github.com/dart-lang/sdk/issues/53096 TEST=isolate_local_function_callbacks_test.dart, plus generated tests and additions to existing tests CoreLibraryReviewExempt: The isolate and FFI packages are VM-only Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/317060 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Liam Appelbe <liama@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
ff4ef0548c |
[vm, compiler] Refactor the A3/A4/A5 trick so it applies to EmitParamMoves.
This allows FfiCallInstr to accept constant inputs. TEST=ci Change-Id: I0436d4a54a5c95d4c6f6abb5215438fe72cf1042 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/316721 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
edeac698c2 |
[vm/ffi] Closure callbacks for async callbacks
This change is almost trivial. The closure is stored on the callback's RawReceivePort, not in the VM. So we can basically just remove the CFE check and it pretty much works. The only problem is that we can't set function.FfiCallbackTarget anymore, so most of the CL is dealing with that. A few places were deciding whether an FFI trampoline was a call or a callback based on whether function.FfiCallbackTarget() was null. But now the target will be null for async callbacks. So instead I've added a new value to the FfiCallbackKind enum (and renamed it), and changed those checks. Sync callback closures will be a separate CL, because they're more complicated. Bug: https://github.com/dart-lang/sdk/issues/52689 Change-Id: I8e5dfb557362e679f66195b735c3c382e6792840 TEST=async_void_function_callbacks_test.dart Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/316160 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
13ec07415b |
[vm] Async FFI callbacks
More details about the design: https://docs.google.com/document/d/1QDjyY_6wOTOgURwpeYMKU9qEz0gKxx2MUrdruC6Kp6c/edit?usp=sharing Change-Id: Ie3985d86dca7f5010044ca46c33ca177588c0f69 Bug: #37022 CoreLibraryReviewExempt: Reviewed by vm and api groups. web and wasm groups not affected because FFI isn't on those platforms. TEST=async_void_function_callbacks_test.dart, ffi_callback_metadata_test.cc, other front end tests Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/305900 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> |
||
|
|
07f587504b |
Reland "[vm] Migrate FFI callbacks to the new metadata system."
This reverts https://dart-review.googlesource.com/c/sdk/+/306674 Patchset 1 is a pure rollback of the rollback. Patchset 2 is https://dart-review.googlesource.com/c/sdk/+/306316 Patchset 4+ is the forward fix for the Fuchsia issues. The Fuchsia bug that we're fixing (or working around), is that VirtualMemory::DuplicateRX doesn't work on Fuchsia. A proper fix will require special casing it, like on MacOS. In the mean time we can avoid using this function by only allowing one page of trampolines on Fuchsia. Unfortunately, when I removed the BSS stuff from the original CL, it was necessary to duplicate even the first page, so I've had to add that stuff back just for Fuchsia. Change-Id: Id42de78ee5de126bcc83bfa4148f6efb4045f976 Bug: https://github.com/dart-lang/sdk/issues/52579 Bug: https://buganizer.corp.google.com/issues/284959841 Fixes: https://github.com/dart-lang/sdk/issues/52581 TEST=CI, especially vm-fuchsia-release-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/306676 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
8ea3e9fd0d |
Revert "[vm] Migrate FFI callbacks to the new metadata system."
Roll back https://dart-review.googlesource.com/c/sdk/+/302903 and https://dart-review.googlesource.com/c/sdk/+/306124 Since the bug is in VirtualMemory::DuplicateRX, also roll back https://dart-review.googlesource.com/c/sdk/+/303960 https://dart-review.googlesource.com/c/sdk/+/304400 https://dart-review.googlesource.com/c/sdk/+/304620 Bug: https://buganizer.corp.google.com/issues/284959841 Change-Id: Id212de209fb57b2c3395bb61064dc8f569832884 TEST=CI Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/306674 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> |
||
|
|
f0f732b1a6 |
[vm] Migrate FFI callbacks to the new metadata system.
This is the same metadata system that will support async callbacks. The main thing this does is take the trampolines that used to be JIT only, and use them in AOT too. This is partly a safety thing (there's some extra checks that used to be skipped on AOT), but mostly just so that the metadata system is unified between the sync and async callbacks. More details about the design: https://docs.google.com/document/d/1QDjyY_6wOTOgURwpeYMKU9qEz0gKxx2MUrdruC6Kp6c/edit?usp=sharing I split this off the async CL. Some of the comments refer to async stuff that doesn't exist yet, but it's coming immediately after this so I didn't update them. Change-Id: Icd5e86934ee9ae34c2c0e2ed2bbd1b928a7184ac TEST=ffi_callback_metadata_test.cc and CI Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/302903 Reviewed-by: Ryan Macnak <rmacnak@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> |
||
|
|
c747a25d66 |
[vm] Add arch-specific bits for Android RISCV64.
TEST=local AOSP build Bug: https://github.com/flutter/flutter/issues/117973 CoreLibraryReviewExempt: VM-only Change-Id: I9417e86f025bebee359d8ba50ee6b5c8589c2744 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/303011 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
2d230aa0b5 |
[vm/ffi] Move ffi-callback related state from Thread to ObjectStore, move jit trampolines from Isolate to IsolateGroup
The ffi-callback related information on the [Thread] object is metadata corresponding to ffi-callback-trampoline [Function] objects. There is nothing thread or isolate specific about it. Moving it away from [Thread] is needed because an [Isolate] can have different [Thread] objects across its lifetime (see [0]): When the stack of an isolate is empty, we reserve now the right to re-cycle the [Thread]. If the isolate later runs again, it may get a new [Thread] object. This CL moves this information from [Thread] to the [ObjectStore]. In addition we make the compiler be responsible for populating this metadata - instead of doing this per-call site of `Pointer.fromFunction()`. It will be preserved across snapshot writing & snapshot reading (for AppJIT as well as AppAOT). Similarly the JIT trampolines that are on Isolate aren't isolate specific and can go to [IsolateGroup]. This simplifies doing the above as the compiler can allocate those as well. The effect is that [Thread] object gets smaller, GC doesn't have to visit the 2 slots per-thread. It comes at expense of 2 more loads when invoking the callback. [0] https://dart-review.googlesource.com/c/sdk/+/297920 TEST=Regression test is vm/ffi{,_2}/invoke_callback_after_suspension_test Change-Id: Ifde46a9f6e79819b5c0e359c3d3998d1d93b9b1e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/303700 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Liam Appelbe <liama@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com> |
||
|
|
7247a1b3b7 |
Reland "[vm] Avoid expanding/flattening type arguments vectors in Type objects"
This is a reland of commit
|
||
|
|
3e2d3bc77f |
Revert "[vm] Avoid expanding/flattening type arguments vectors in Type objects"
This reverts commit
|
||
|
|
135443706b |
[vm] Avoid expanding/flattening type arguments vectors in Type objects
Previously, vectors of type arguments were expanded to include type arguments corresponding to superclasses both in the instances of generic classes and in Type objects (after type finalization). As a result, Type objects after finalization could be recursive and need to use extra TypeRef objects to break loops. The finalization of types was very complex and sometimes slow. This change simplifies the representation of Type objects: now they always have short type argument vectors, corresponding only to the type parameters of their own classes (both before and after finalization). Vectors of type arguments in the instances of generic classes are still expanded/flattened. This greatly simplifies type finalization, makes Type objects non-recursive and removes the need to create and handle excessive TypeRefs for type arguments corresponding to superclasses, as those type arguments are no longer included into types. The only remaining use of TypeRefs is for bounds of type parameters. In order to expand/flatten type arguments, new methods Type::GetInstanceTypeArguments / Class::GetInstanceTypeArguments are introduced. They build canonical declaration type arguments once (for each class), and then instantiate them as needed. There are also simple helper methods to shrink type arguments (TypeArguments::FromInstanceTypeArguments) and expand type arguments without filling type arguments corresponding to superclasses (TypeArguments::ToInstantiatorTypeArguments). Time of edge case 'regress_51960_test' 15min -> 300ms. TEST=ci, runtime/tests/vm/dart/regress_51960_test.dart Fixes https://github.com/dart-lang/sdk/issues/52022 Fixes https://github.com/dart-lang/sdk/issues/51960 Change-Id: I75b466b74698a33c0bb5e1dcbd29542e413812a1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/295060 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> |
||
|
|
5941defa81 |
[vm] Update to constexpr in runtime/vm/compiler.
TEST=build Change-Id: Idf0a05cf8c27164834b5d8464b230cd334a06835 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/293082 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
92e5746494 |
Reland "[vm/ffi] Add class modifiers"
This is a reland of commit
|
||
|
|
2cc96bfa0b |
[vm] Add an ABI for Fuchsia RISC-V.
https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0211_fuchsia_on_risc-v TEST=./tools/build.py -mrelease -asimriscv64 gen_snapshot_fuchsia gen_snapshot_product_fuchsia CoreLibraryReviewExempt: VM-only Change-Id: Ie62addda6c15a5b44e814c49b543319aef4fc5e9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/281869 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> |
||
|
|
7471994270 |
Revert "[vm/ffi] Add class modifiers"
This reverts commit
|
||
|
|
1755f89092 |
[vm/ffi] Add class modifiers
Adds class modifiers to `dart:ffi`. Migrates all user-defined subclasses of `Struct`, `Union`, `Opaque`, and `AbiSpecificInteger` to be `final class`es. Does not remove the manual error checking, so some errors will show up twice now in language version 3.0. In language version <3.0, only the FFI-specific error will show up. In a follow-up CL, we will try to make the language-errors to show up also <3.0 so that we can remove the FFI-specific errors. Examples of duplicated errors: pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart TEST=pkg/analyzer/test/ (for the analyzer) TEST=pkg/front_end/testcases/ (for the CFE) TEST=test/ffi/ (for the VM) CoreLibraryReviewExempt: No need for dart2js to review. Bug: https://github.com/dart-lang/sdk/issues/51683 Change-Id: I2964ceccb7db59fbdaf6be5319f5e4ec2dabe0f3 Cq-Include-Trybots: luci.dart.try:pkg-linux-debug-try,pkg-win-release-try,pkg-mac-release-try,vm-precomp-ffi-qemu-linux-release-riscv64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-debug-arm-try,vm-reload-rollback-linux-debug-x64-try,analyzer-analysis-server-linux-try,analyzer-linux-release-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/289223 Reviewed-by: Johnni Winther <johnniwinther@google.com> Reviewed-by: Devon Carew <devoncarew@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Jackson Gardner <jacksongardner@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> |
||
|
|
b9b6511ca6 |
Spelling sdk
Closes https://github.com/dart-lang/sdk/pull/50918 Co-authored-by: Josh Soref <jsoref@gmail.com> GitOrigin-RevId: 1fd275051c561b63d374fb47e76a22424c4a12a9 Change-Id: I97790d9c79ff659f2c1fa2d2d46d041fe67957cb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278530 Reviewed-by: William Hesse <whesse@google.com> Commit-Queue: Alexander Thomas <athom@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com> |
||
|
|
6ef57b86c1 |
[vm/ffi] Support varargs
This CL introduces `VarArgs` to `NativeFunction` signatures. The `VarArgs` type takes a single type argument. This type argument is a subtype of `NativeType` if there is a single variadic argument, and a record with native types if there are multiple variadic arguments. For example: `NativeFunction<Void Function(Pointer<Char>, VarArgs<(Int32,Int32)>)>` for calling refering to a `printf` binding with two `int32_t` arguments passed as variadic arguments. The logic of the native calling conventions are detailed in https://dart-review.googlesource.com/c/sdk/+/278342. Here we explain how this influences the FFI pipeline. First, now that `VarArgs` is part of signatures, we have to unwrap that when with the C types in the CFE transform and checking (analyzer is in a separate CL), and also in the marshaller when looking up the C type of arguments. Second, we have to deal with `BothNativeLocations`. On windows x64, floating point arguments must be passed both in FPU _and_ CPU registers. For FFI calls, we solve this in the argument moves by just copying to both locations. For FFI callbacks, we just take the FPU register location (which avoids an extra bitcast). Third, on System-V, we have to pass an upper bound of the number of XMM registers used in AL. This means we instead RAX, we use R13 for the target address. For variadic calls, we always pass 8 in AL as the valid upper bound. We could consider passing the actual number of XMM registers used. We keep using RAX as default register for the function address on non- variadic calls, because changing to R13 (the first free) register creates more spilling in leaf calls. R13 is callee-saved while RAX is not, so using R13 instead of RAX causes us to have to spill the value from RAX on leaf calls. Fourth, on both x64 and RISC-V, we pass floats in integer locations. `EmitNativeMove` has been modified to deal with this, so that we do not have to insert more `BitCastInstr`s. The tests are generated by a test generator: `tests/ffi/generator/`. The formatter doesn't support records yet, so the tests are not properly formatted. Bug: https://github.com/dart-lang/sdk/issues/50798 TEST=tests/ffi/*_varargs_* Closes: https://github.com/dart-lang/sdk/issues/38578 Closes: https://github.com/dart-lang/sdk/issues/49460 Closes: https://github.com/dart-lang/sdk/issues/50858 Change-Id: I6a6296fe972527f8a54ac75a630131769e3cc540 Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-win-debug-ia32-try,vm-kernel-linux-debug-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-android-release-arm_x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-precomp-ffi-qemu-linux-release-riscv64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-precomp-msan-linux-release-x64-try,app-kernel-linux-debug-x64-try,vm-kernel-mac-release-arm64-try,vm-kernel-nnbd-mac-debug-arm64-try,vm-kernel-nnbd-mac-debug-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/276921 Reviewed-by: Devon Carew <devoncarew@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> |
||
|
|
1854bb00c6 |
[vm/ffi] Support varargs in the backend
On ARM64 macos and ios, when varargs are used, the first vararg blocks all cpu and fpu registers. On Windows x64, when varargs are used, floating point arguments are passed _both_ in the integer and double register. The Windows logic requires a new kind of native location: `BothNativeLocations`, which signals that a value needs to be copied to both locations before an FFI call, and can be copied from any of the two locations when getting an FFI callback. TEST=runtime/vm/compiler/ffi/unit_tests/variadic_double/x64_win.expect Note that integer arguments already block out the corresponding xmm registers on Windows x64. On System-V, an upper bound of the number of XMM registers used must be passed in AL. (Not reflected in the unit tests here, but will be in the dependent CL.) On ARM (32 bit), using varargs forces the calling convention to be in softfp mode even on hardfp supported devices. On RISC-V, the FPU registers are blocked when using varargs. TEST=runtime/vm/compiler/ffi/native_calling_convention_test.cc Test outputs in: runtime/vm/compiler/ffi/unit_tests/variadic_* Run test with `tools/test.py ffi_unit`. Bug: https://github.com/dart-lang/sdk/issues/38578 Change-Id: Ic568f8156c1c28ac3d6a2144805edf8caaa0169c Cq-Include-Trybots: luci.dart.try:vm-precomp-ffi-qemu-linux-release-arm-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278342 Reviewed-by: Ryan Macnak <rmacnak@google.com> |
||
|
|
50b94ef9fc |
Spelling runtime bin
TEST=build VM Closes: https://github.com/dart-lang/sdk/pull/50862 GitOrigin-RevId: ae54b37666f70f670ee3af11c984c7e9a7e9da26 Change-Id: I459fda0439a1cd368f488a70d84ee6bb915e60bb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277761 Commit-Queue: Martin Kustermann <kustermann@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> |
||
|
|
1aeece5e31 |
Spelling runtime vm compiler
Closes https://github.com/dart-lang/sdk/pull/50784 Co-authored-by: Josh Soref 2119212+jsoref@users.noreply.github.com TEST=ci GitOrigin-RevId: dbb20e7ee532a3490e86a633b5164ebab54bd38d Change-Id: I9bd29543c4417efd4f338ff1c0e45c4ddbcc044d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/276622 Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Erik Ernst <eernst@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> |
||
|
|
4be2981c2d |
[vm/ffi] Ensure there's a single Function object per ffi-callback + exceptional-return combination
Right each `Pointer.fromFunction()` invocation will lead to creation of
a new ffi trampoline function & it's following JITed code. In AOT we
have exactly one ffi trampoline per target/native-signature/exceptional-return
combination.
=> This CL ensures we have only one such function.
Furthermore each `Pointer.fromFunction()` will currently perform 2
runtime calls in JIT: One to create a `Function` object, the other to
JIT that function & register callback metadata.
=> This CL ensures we won't do a runtime call to get a function, instead
do it at compile-time (as in AOT)
Furthermore we eagerly assign a callback-id to the unique/deduped ffi
trampoline callbacks. Only when the application requests a pointer, do
we populate metadata on the `Thread` object.
This CL doesn't (yet) change the fact that in JIT mode we have
isolate-specific jit trampolines (that will call now shared ffi trampoline
functions).
We also avoid baking in C++ runtime function pointers in generated
code. As a result we can now preserve ffi trampolines across AppJIT
serialization.
As a nice side-effect, we remove 100 lines of code.
TEST=ffi{,_2}/ffi_callback_unique_test
Issue https://github.com/dart-lang/sdk/issues/50611
Change-Id: I458831a47b041a088086f28f825de2a3849f6adc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273420
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
|
||
|
|
715866aed3 |
[vm, compiler] Remove quadratic time spent verifying handle lifetime.
Instead of checking whether a handle is a zone handle rather than a scoped handle by iterating the zone handle blocks, reserve an extra slot in debug mode to record the handle's lifetime. TEST=ci Bug: https://github.com/dart-lang/sdk/issues/50408 Change-Id: I121c76d02b03e5d2141450077bc6e9da3cb60a5d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/268801 Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com> |
||
|
|
a7f7c0c5ac |
[vm] Support serialization of FFI callbacks in IL serialization
TEST=tests/ffi/function_callbacks_test.dart TEST=Manual run of vm-kernel-precomp-linux-debug-x64-try with --test_il_serialization enabled. Issue: https://github.com/dart-lang/sdk/issues/43299 Change-Id: Ia57021d9091e8a80de3645cb4723ebdbb5a3d33d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/256371 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
5f985eb3e6 |
Reland "[vm/compiler] Initial implementation of IL binary serialization"
This is a reland of commit
|