15dfcca89f
This CL enables dart:ffi on Fuchsia. It has the necessary VM changes for x64 and arm64. - Allocate VM callback trampoline memory pages with RX. - Do not use x18 on arm64. - Save x18 on arm64 in Thread to be able to restore it on exceptions. We do not have a bot testing this https://github.com/dart-lang/sdk/issues/38752. The bot only tests the build, it does not run the emulator. Manual build and test steps x64 Fuchsia emulator: ``` tools/build.py --os=fuchsia -m debug fuchsia_ffi_test_package xvfb-run third_party/fuchsia/sdk/linux/bin/femu.sh --image qemu-x64 -N --headless third_party/fuchsia/sdk/linux/bin/fserve.sh --bucket fuchsia-sdk --image qemu-x64 --device-name step-atom-yard-juicy third_party/fuchsia/sdk/linux/bin/fpublish.sh out/DebugFuchsiaX64/gen/dart_ffi_test_debug/dart_ffi_test_debug.far third_party/fuchsia/sdk/linux/bin/fssh.sh --device-name step-atom-yard-juicy run fuchsia-pkg://fuchsia.com/dart_ffi_test_debug#meta/dart.cmx --ignore-unrecognized-flags --packages=/pkg/data/.packages --disable-dart-dev /pkg/data/tests/ffi/all_positive.dart ``` Manual build and test steps arm64 Fuchsia emulator: ``` tools/build.py --no-start-goma --os=fuchsia -m debug -a arm64 fuchsia_ffi_test_package xvfb-run third_party/fuchsia/sdk/linux/bin/femu.sh --image qemu-arm64 -N --headless --experiment-arm64 third_party/fuchsia/sdk/linux/bin/fserve.sh --bucket fuchsia-sdk --image qemu-arm64 --device-name step-atom-yard-juicy third_party/fuchsia/sdk/linux/bin/fpublish.sh out/DebugFuchsiaARM64/gen/dart_ffi_test_debug/dart_ffi_test_debug.far third_party/fuchsia/sdk/linux/bin/fssh.sh --device-name step-atom-yard-juicy run fuchsia-pkg://fuchsia.com/dart_ffi_test_debug#meta/dart.cmx --ignore-unrecognized-flags --packages=/pkg/data/.packages --disable-dart-dev /pkg/data/tests/ffi/all_positive.dart ``` Note that running on the arm64 emulator takes over an hour. This has been tested on an Estelle device. TEST=Manual test steps above. The AOT mode has seen an initial test in g3 by rolling gen_snapshot and the flutter runner. Arm64 x18 treatment along the lines of https://dart-review.googlesource.com/c/sdk/+/119481: - FfiCallInstr, does not modify x18 at all. We do not have to do anything special when having a C++ frame on top of a Dart frame. - NativeEntryInstr and NativeReturnInstr, saves and restores x18 with PushNativeCalleeSavedRegisters && PopNativeCalleeSavedRegisters. Also save to the thread field in both places. That way the JumpToFrame stub can load from the thread field. Closes: https://github.com/dart-lang/sdk/issues/44434 Change-Id: Ide29369c878fed5909a0d6f7d4c3f7508e179f25 Cq-Include-Trybots: luci.dart.try:vm-fuchsia-release-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/173273 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>