dart-sdk/sdk/lib
Tess Strickland 0d3ade255b [vm/compiler] Limit exposure of untagged pointers to managed memory.
After https://dart-review.googlesource.com/c/sdk/+/330600, there were
more chances for the optimizing compiler to introduce or move
GC-triggering instructions like allocations or boxings between the
retrieval of an untagged pointer to GC-moveable memory and its use.

To limit the chance of this happening, this CL removes the explicit
loading of the untagged payload address when building the initial
flow graph in most cases when the array is not known to be an external
array (an external string, an external typed data object, or an FFI
Pointer).

The remaining case is during view allocation, which extracts the
payload address of the base typed data object underlying the view
(which may be GC-movable) to calculate the payload address that should
be stored in the data field of the view object. See
https://github.com/dart-lang/sdk/issues/54884.

During canonicalization of LoadIndexed, StoreIndexed, and MemoryCopy
instructions, if the cid of an array input is an external array
(external string, external typed data object, or Pointer), then a
LoadField instruction that extracts the untagged payload address
is inserted before the instruction and the corresponding input is
rebound to that LoadField instruction.

Once all compiler passes that involve code motion have been performed,
a new pass looks for LoadIndexed, StoreIndexed, or MemoryCopy where
the cid stored in the instruction for the array is a typed data cid.
In these cases, if the array is not an internal typed data object,
then the payload address is extracted. Waiting until this point ensures
that no GC-triggering instructions are inserted between the extraction
of the payload address and the use. (Internal typed data objects are
left as-is because the payload address is inside the object itself
and doesn't require indirection through the data field of the object).

This CL also replaces code conditional on the array cid with code
that is instead conditional on the array element representation in
cases where it makes sense to do so, since this is a less brittle
check than checking the array cid (e.g., checking for kUnboxedInt8
to load, store, or copy an signed byte from an array instead of
listing all possible array cids that store signed bytes).

This CL also fixes an issue with the ARM64 assembler where calling
LoadFromOffset with an Address that has a non-Offset type would
silently generate bad code instead of triggering the ASSERT in
PrepareLargeOffset.

TEST=vm/dart/typed_list_index_checkbound_il_test

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: I25b5f314943e9254d3d28986d720a5d47f12feeb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352363
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2024-03-22 10:12:39 +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/compiler] Limit exposure of untagged pointers to managed memory. 2024-03-22 10:12:39 +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] Unify TypedDataBase wrappers 2024-02-09 21:27:29 +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 [doc, io] Document the error behavior for File.openRead/file.openWrite 2024-03-14 22:43:32 +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] Fix comparison operator return types 2024-03-04 21:10:02 +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