[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>
Dart is:
Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.
Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.