2019-01-25 16:45:13 +00:00
|
|
|
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
#ifndef RUNTIME_VM_CLASS_ID_H_
|
|
|
|
#define RUNTIME_VM_CLASS_ID_H_
|
|
|
|
|
|
|
|
// This header defines the list of VM implementation classes and their ids.
|
|
|
|
//
|
|
|
|
// Note: we assume that all builds of Dart VM use exactly the same class ids
|
|
|
|
// for these classes.
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
#include "platform/assert.h"
|
|
|
|
|
2019-01-25 16:45:13 +00:00
|
|
|
namespace dart {
|
|
|
|
|
2021-01-15 23:32:02 +00:00
|
|
|
// Size of the class-id part of the object header. See UntaggedObject.
|
2020-08-07 07:24:44 +00:00
|
|
|
typedef uint16_t ClassIdTagType;
|
|
|
|
|
2021-08-13 13:27:41 +00:00
|
|
|
// Classes that are not subclasses of Instance and only handled by the VM,
|
|
|
|
// but do not require any special handling other than being a predefined class.
|
|
|
|
#define CLASS_LIST_INTERNAL_ONLY(V) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Class) \
|
|
|
|
V(PatchClass) \
|
|
|
|
V(Function) \
|
2021-05-05 23:43:14 +00:00
|
|
|
V(TypeParameters) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(ClosureData) \
|
2019-02-13 12:42:47 +00:00
|
|
|
V(FfiTrampolineData) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Field) \
|
|
|
|
V(Script) \
|
|
|
|
V(Library) \
|
|
|
|
V(Namespace) \
|
|
|
|
V(KernelProgramInfo) \
|
2021-02-10 01:21:07 +00:00
|
|
|
V(WeakSerializationReference) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Code) \
|
|
|
|
V(Instructions) \
|
Reland "[vm/aot] Remove object wrapping of bare instructions for AOT snapshots."
Now, when writing an AOT snapshot in bare instructions mode, only
the actual instructions in the RawInstructions payload are serialized
instead of the entire RawInstructions object.
Since there are no longer RawInstructions objects in these AOT
snapshots, we also change how Code objects are serialized. Instead
of just containing a reference to the RawInstructions object, we
serialize two pieces of information: where the instructions
payload for this Code object begins and whether there was a single
entry for the instructions payload. (To save space, the single
entry bit is serialized as the low order bit of the unchecked
offset, which was already being serialized).
While we also need the length of the instructions payload, we
approximate it for all but the last Code object by subtracting
the next Code object's payload start from this Code object's
payload start. For the last Code object, we assume it extends
to the end of the instructions image.
Changes on flutter gallery in release mode:
armv7: instructions size -2.70%, total size -1.73%
armv8: instructions size -6.04%, total size -3.63%
Fixes https://github.com/dart-lang/sdk/issues/38451.
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-release-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm64-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-mac-release-simarm64-try,vm-kernel-precomp-win-release-x64-try
Change-Id: Ia0a5c4e5e47c956776dc62503da38ec55a143c04
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/134325
Commit-Queue: Teagan Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-02-10 15:08:04 +00:00
|
|
|
V(InstructionsSection) \
|
2021-04-13 02:36:16 +00:00
|
|
|
V(InstructionsTable) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(ObjectPool) \
|
|
|
|
V(PcDescriptors) \
|
|
|
|
V(CodeSourceMap) \
|
[vm/compiler] Reland "Further compress the information... in StackMaps."
Fixes an assumption that CompressedStackMapsIterator::Find() is never
passed a PC offset of 0. Adds back an ASSERT that was dropped which checks
for specific cases where a given PC offset does not have a stack map entry.
Original commit message:
Lifting the PC offset in a2bb730 was a small, lightweight change that
gave us big gains, at least on 32-bit architectures. Here, we make
much more invasive changes that will improve the amount of memory used
by the information previously stored in StackMap objects.
Instead of allocating separate objects for StackMaps, we instead compress
all StackMap information for a given Code object into a single object
(CompressedStackMaps, or CSM for short). This replaces the Array used to
store PC offsets (as Smis) and the individual StackMap objects.
While we lose all canonicalization for individual StackMap entries, the
drop in space required to store stack map information more than offsets that.
-----
The impact on AOT snapshot size when compiling the Flutter Gallery
in release mode:
armv7: Total size -2.58% (Isolate RO: +14.46%, Isolate snapshot: -22.93%)
armv8: Total size -1.85% (Isolate RO: +15.69%, Isolate snapshot: -22.97%)
The impact on in-memory, not on-disk, size for the Flutter Gallery as seen
in the Observatory while running a profile (not release) build:
armv7: Drops from 7.1 MB to 6.2MB (-0.9 MB)
armv8: Drops from 13.5MB to 11.7MB (-1.8 MB)
-----
Bug: https://github.com/dart-lang/sdk/issues/35274, https://github.com/dart-lang/sdk/issues/38873
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-mac-debug-simdbc64-try
Change-Id: I111b129b0ed64f03184370bceb7cda69d5d4b3c9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121700
Commit-Queue: Teagan Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2019-10-16 08:25:53 +00:00
|
|
|
V(CompressedStackMaps) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(LocalVarDescriptors) \
|
|
|
|
V(ExceptionHandlers) \
|
|
|
|
V(Context) \
|
|
|
|
V(ContextScope) \
|
2021-06-11 18:44:56 +00:00
|
|
|
V(Sentinel) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(SingleTargetCache) \
|
|
|
|
V(UnlinkedCall) \
|
Reland "[vm/aot] Only patch call-sites to monomorphic entry-points when the receiver is proven to be a heap object."
This reverts commit 5f81efb4a3f7d5ad6a7a6da4e35f572c884abede.
Reason for revert: 3xH bot is green again.
Original change's description:
> Revert "[vm/aot] Only patch call-sites to monomorphic entry-points when the receiver is proven to be a heap object."
>
> This reverts commit ab2026af45c407eb2958bca3898823d4e6de4dc7.
>
> Reason for revert: Flutter 3xH is broken on Golem.
>
> Original change's description:
> > [vm/aot] Only patch call-sites to monomorphic entry-points when the receiver is proven to be a heap object.
> >
> > Flutter Gallery ARMv8: -0.8% total, -1.3% instructions
> > Flutter Gallery ARMv7: -0.7% total, -1.2% instructions
> >
> > There are some performance regressions, in four categories:
> >
> > 1. Arithmetic on num types (e.g. MinLib, MaxLib):
> > We believe arithmetic on num types is rare in practice, and can be optimized later
> > by specializing the call-sites.
> >
> > 2. Lack of types (e.g. MeshDecompression, ImagingGaussianBlur, Crypto*):
> > These (and similar benchmarks) are written in a very untyped style, which is not
> > representative of Dart 2 style. We've confirmed that the regressions disappear if
> > the benchmarks are annotated with appropriate types.
> >
> > 3. Megamorphic calls which are specialized in the benchmark (e.g. DeltaBlue):
> > DeltaBlue uses string interpolation in one place, so the toString() method in the
> > string interpolation helper is monomorphic for _Smis. However, in a realistic programs,
> > string interpolation is used much more frequently and with different types, so it's very
> > unlikely that this call would be monomorphic. When string interpolation is removed, there's
> > a remaining 1.3% regression on DeltaBlue which is not yet accounted for.
> >
> > 4. Noisy benchmarks
> > The remaining regressions are on benchmarks which show frequent jitter historically.
> >
> > There are also 1-4% improvements on many benchmarks (Golem's "noise" analysis is hiding
> > many of them, look at the graphs).
> >
> > For the reasons above, we believe the regressions justified by the code size improvement.
> >
> > Change-Id: Ic9b281d4383a6111de9d6f44347976ffa61a6ca6
> > Cq-Include-Trybots:luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm64-try,vm-kernel-precomp-bare-linux-release-simarm64-try
> > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/128667
> > Commit-Queue: Samir Jindel <sjindel@google.com>
> > Reviewed-by: Ryan Macnak <rmacnak@google.com>
> > Reviewed-by: Martin Kustermann <kustermann@google.com>
>
> TBR=kustermann@google.com,rmacnak@google.com,alexmarkov@google.com,sjindel@google.com
>
> Change-Id: I411aae4b230f2a08146ad3bf3e7a10aa6592db0e
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try, vm-kernel-precomp-linux-release-simarm-try, vm-kernel-precomp-linux-release-simarm64-try, vm-kernel-precomp-bare-linux-release-simarm64-try
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/131660
> Reviewed-by: Samir Jindel <sjindel@google.com>
> Commit-Queue: Samir Jindel <sjindel@google.com>
TBR=kustermann@google.com,rmacnak@google.com,alexmarkov@google.com,sjindel@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I36e4e9d598033fcc934c2cdf5b061aa11255d3b2
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try, vm-kernel-precomp-linux-release-simarm-try, vm-kernel-precomp-linux-release-simarm64-try, vm-kernel-precomp-bare-linux-release-simarm64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/131837
Reviewed-by: Samir Jindel <sjindel@google.com>
Commit-Queue: Samir Jindel <sjindel@google.com>
2020-01-16 14:21:16 +00:00
|
|
|
V(MonomorphicSmiableCall) \
|
2020-04-04 15:03:48 +00:00
|
|
|
V(CallSiteData) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(ICData) \
|
|
|
|
V(MegamorphicCache) \
|
|
|
|
V(SubtypeTestCache) \
|
2020-07-09 00:15:07 +00:00
|
|
|
V(LoadingUnit) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Error) \
|
|
|
|
V(ApiError) \
|
|
|
|
V(LanguageError) \
|
|
|
|
V(UnhandledException) \
|
2021-08-13 13:27:41 +00:00
|
|
|
V(UnwindError)
|
|
|
|
|
|
|
|
// Classes that are subclasses of Instance and neither part of a specific cid
|
|
|
|
// grouping like strings, arrays, etc. nor require special handling outside of
|
|
|
|
// being a predefined class.
|
|
|
|
#define CLASS_LIST_INSTANCE_SINGLETONS(V) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Instance) \
|
|
|
|
V(LibraryPrefix) \
|
|
|
|
V(TypeArguments) \
|
|
|
|
V(AbstractType) \
|
|
|
|
V(Type) \
|
Reland "[vm] Implement `Finalizer`"
Original CL in patchset 1.
Split-off https://dart-review.googlesource.com/c/sdk/+/238341
And pulled in fix https://dart-review.googlesource.com/c/sdk/+/238582
(Should merge cleanly when this lands later.)
This CL implements the `Finalizer` in the GC.
The GC is specially aware of two types of objects for the purposes of
running finalizers.
1) `FinalizerEntry`
2) `Finalizer` (`FinalizerBase`, `_FinalizerImpl`)
A `FinalizerEntry` contains the `value`, the optional `detach` key, and
the `token`, and a reference to the `finalizer`.
An entry only holds on weakly to the value, detach key, and finalizer.
(Similar to how `WeakReference` only holds on weakly to target).
A `Finalizer` contains all entries, a list of entries of which the value
is collected, and a reference to the isolate.
When a the value of an entry is GCed, the enry is added over to the
collected list.
If any entry is moved to the collected list, a message is sent that
invokes the finalizer to call the callback on all entries in that list.
When a finalizer is detached by the user, the entry token is set to the
entry itself and is removed from the all entries set.
This ensures that if the entry was already moved to the collected list,
the finalizer is not executed.
To speed up detaching, we use a weak map from detach keys to list of
entries. This ensures entries can be GCed.
Both the scavenger and marker tasks process finalizer entries in
parallel.
Parallel tasks use an atomic exchange on the head of the collected
entries list, ensuring no entries get lost.
The mutator thread is guaranteed to be stopped when processing entries.
This ensures that we do not need barriers for moving entries into the
finalizers collected list.
Dart reads and replaces the collected entries list also with an atomic
exchange, ensuring the GC doesn't run in between a load/store.
When a finalizer gets posted a message to process finalized objects, it
is being kept alive by the message.
An alternative design would be to pre-allocate a `WeakReference` in the
finalizer pointing to the finalizer, and send that itself.
This would be at the cost of an extra object.
Send and exit is not supported in this CL, support will be added in a
follow up CL. Trying to send will throw.
Bug: https://github.com/dart-lang/sdk/issues/47777
TEST=runtime/tests/vm/dart/finalizer/*
TEST=runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
TEST=runtime/vm/object_test.cc
Change-Id: Ibdfeadc16d5d69ade50aae5b9f794284c4c4dbab
Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-ffi-android-debug-arm64c-try,dart-sdk-mac-arm64-try,vm-kernel-mac-release-arm64-try,pkg-mac-release-arm64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try,vm-kernel-win-debug-x64c-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-nnbd-win-release-ia32-try,vm-ffi-android-debug-arm-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,benchmark-linux-try,flutter-analyze-try,flutter-frontend-try,pkg-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238086
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2022-03-25 10:29:30 +00:00
|
|
|
V(FinalizerBase) \
|
|
|
|
V(Finalizer) \
|
[vm] Implement `NativeFinalizer`
This CL implements `NativeFinalizer` in the GC.
`FinalizerEntry`s are extended to track `external_size` and in which
`Heap::Space` the finalizable value is.
On attaching a native finalizer, the external size is added to the
relevant heap. When the finalizable value is promoted from new to old
space, the external size is promoted as well. And when a native
finalizer is run or is detached, the external size is removed from the
relevant heap again.
In contrast to Dart `Finalizer`s, `NativeFinalizer`s are run on isolate
shutdown.
When the `NativeFinalizer`s themselves are collected, the finalizers are
not run. Users should stick the native finalizer in a global variable to
ensure finalization. We will revisit this design when we add send and
exit support, because there is a design space to explore what to do in
that case. This current solution promises the least to users.
In this implementation native finalizers have a Dart entry to clean up
the entries from the `all_entries` field of the finalizer. We should
consider using another data structure that avoids the need for this Dart
entry. See the TODO left in the code.
Bug: https://github.com/dart-lang/sdk/issues/47777
TEST=runtime/tests/vm/dart(_2)/isolates/fast_object_copy_test.dart
TEST=runtime/vm/object_test.cc
TEST=tests/ffi(_2)/vmspecific_native_finalizer_*
Change-Id: I8f594c80c3c344ad83e1f2de10de028eb8456121
Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-ffi-android-debug-arm64c-try,dart-sdk-mac-arm64-try,vm-kernel-mac-release-arm64-try,pkg-mac-release-arm64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try,vm-kernel-win-debug-x64c-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-nnbd-win-release-ia32-try,vm-ffi-android-debug-arm-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,benchmark-linux-try,flutter-frontend-try,pkg-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/236320
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2022-03-26 09:41:21 +00:00
|
|
|
V(NativeFinalizer) \
|
Reland "[vm] Implement `Finalizer`"
Original CL in patchset 1.
Split-off https://dart-review.googlesource.com/c/sdk/+/238341
And pulled in fix https://dart-review.googlesource.com/c/sdk/+/238582
(Should merge cleanly when this lands later.)
This CL implements the `Finalizer` in the GC.
The GC is specially aware of two types of objects for the purposes of
running finalizers.
1) `FinalizerEntry`
2) `Finalizer` (`FinalizerBase`, `_FinalizerImpl`)
A `FinalizerEntry` contains the `value`, the optional `detach` key, and
the `token`, and a reference to the `finalizer`.
An entry only holds on weakly to the value, detach key, and finalizer.
(Similar to how `WeakReference` only holds on weakly to target).
A `Finalizer` contains all entries, a list of entries of which the value
is collected, and a reference to the isolate.
When a the value of an entry is GCed, the enry is added over to the
collected list.
If any entry is moved to the collected list, a message is sent that
invokes the finalizer to call the callback on all entries in that list.
When a finalizer is detached by the user, the entry token is set to the
entry itself and is removed from the all entries set.
This ensures that if the entry was already moved to the collected list,
the finalizer is not executed.
To speed up detaching, we use a weak map from detach keys to list of
entries. This ensures entries can be GCed.
Both the scavenger and marker tasks process finalizer entries in
parallel.
Parallel tasks use an atomic exchange on the head of the collected
entries list, ensuring no entries get lost.
The mutator thread is guaranteed to be stopped when processing entries.
This ensures that we do not need barriers for moving entries into the
finalizers collected list.
Dart reads and replaces the collected entries list also with an atomic
exchange, ensuring the GC doesn't run in between a load/store.
When a finalizer gets posted a message to process finalized objects, it
is being kept alive by the message.
An alternative design would be to pre-allocate a `WeakReference` in the
finalizer pointing to the finalizer, and send that itself.
This would be at the cost of an extra object.
Send and exit is not supported in this CL, support will be added in a
follow up CL. Trying to send will throw.
Bug: https://github.com/dart-lang/sdk/issues/47777
TEST=runtime/tests/vm/dart/finalizer/*
TEST=runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
TEST=runtime/vm/object_test.cc
Change-Id: Ibdfeadc16d5d69ade50aae5b9f794284c4c4dbab
Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-ffi-android-debug-arm64c-try,dart-sdk-mac-arm64-try,vm-kernel-mac-release-arm64-try,pkg-mac-release-arm64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try,vm-kernel-win-debug-x64c-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-nnbd-win-release-ia32-try,vm-ffi-android-debug-arm-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,benchmark-linux-try,flutter-analyze-try,flutter-frontend-try,pkg-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238086
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2022-03-25 10:29:30 +00:00
|
|
|
V(FinalizerEntry) \
|
2021-01-07 23:45:37 +00:00
|
|
|
V(FunctionType) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(TypeRef) \
|
|
|
|
V(TypeParameter) \
|
|
|
|
V(Closure) \
|
|
|
|
V(Number) \
|
|
|
|
V(Integer) \
|
|
|
|
V(Smi) \
|
|
|
|
V(Mint) \
|
|
|
|
V(Double) \
|
|
|
|
V(Bool) \
|
|
|
|
V(Float32x4) \
|
|
|
|
V(Int32x4) \
|
|
|
|
V(Float64x2) \
|
2019-04-03 12:50:57 +00:00
|
|
|
V(TypedDataBase) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(TypedData) \
|
|
|
|
V(ExternalTypedData) \
|
2019-03-15 21:24:15 +00:00
|
|
|
V(TypedDataView) \
|
2019-02-13 12:42:47 +00:00
|
|
|
V(Pointer) \
|
|
|
|
V(DynamicLibrary) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Capability) \
|
|
|
|
V(ReceivePort) \
|
|
|
|
V(SendPort) \
|
|
|
|
V(StackTrace) \
|
2022-04-29 01:03:50 +00:00
|
|
|
V(SuspendState) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(RegExp) \
|
|
|
|
V(WeakProperty) \
|
[vm] Implement `WeakReference` in the VM
This CL implements `WeakReference` in the VM.
* This reduces the size of weak references from 2 objects using 8 words
to 1 object using 4 words.
* This makes loads of weak reference targets a single load instead of
two.
* This avoids the fix-point in the GC and message object copying for
weak references. (N.b. Weak references need to be processed _after_
the fix-point for weak properties.)
The semantics of weak references in messages is that their target gets
set to `null` if the target is not included in the message by a strong
reference.
The tests take particular care to exercise the case where a weak
reference's target is only kept alive because a weak property key is
alive and it refers to the target in its value. This exercises the fact
that weak references need to be processed last.
Does not add support for weak references in the app snapshot. It would
be dead code until we start using weak references in for example the
CFE.
This CL does not try to unify weak references and weak properties in
the GC or messaging (as proposed in go/dart-vm-weakreference), because
their semantics differ enough.
Closes: https://github.com/dart-lang/sdk/issues/48162
TEST=runtime/tests/vm/dart/finalizer/weak_reference_run_gc_test.dart
TEST=runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
TEST=runtime/vm/object_test.cc
TEST=tests/lib/isolate/weak_reference_message_1_test.dart
TEST=tests/lib/isolate/weak_reference_message_2_test.dart
Change-Id: I3810e919a5866f3ae8a95bd9aa23a880a0b0921c
Cq-Include-Trybots: luci.dart.try:app-kernel-linux-debug-x64-try,dart-sdk-mac-arm64-try,vm-canary-linux-debug-try,vm-fuchsia-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simriscv64-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-nnbd-linux-release-ia32-try,vm-kernel-nnbd-linux-release-simarm64-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-nnbd-mac-debug-arm64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-win-release-x64-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232087
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2022-02-10 21:59:41 +00:00
|
|
|
V(WeakReference) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(MirrorReference) \
|
2020-02-14 21:40:17 +00:00
|
|
|
V(FutureOr) \
|
2019-06-06 19:49:07 +00:00
|
|
|
V(UserTag) \
|
2021-02-10 01:21:07 +00:00
|
|
|
V(TransferableTypedData)
|
2019-01-25 16:45:13 +00:00
|
|
|
|
2021-08-13 13:27:41 +00:00
|
|
|
#define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY_NOR_MAP(V) \
|
|
|
|
CLASS_LIST_INTERNAL_ONLY(V) CLASS_LIST_INSTANCE_SINGLETONS(V)
|
|
|
|
|
[vm] Introduce immutable maps and sets in backend
This CL introduces immutable maps and sets in the VM backend but does
not yet target them from the frontend. The changes are tested by unit
tests constructing these immutable maps and sets.
This CL introduces immutable variants of the hash map and set in
compact_hash.dart and recognizes them in the VM. The immutable ones
use a different mixin with a different recognized method for accessing
members.
* Data list is an immutable list with a different cid. (Otherwise the
optimizer notices that immutable and mutable lists cannot be equal.)
* Index is a nullable mutable typed data. (Otherwise optimizer removes
necessary null checks.)
* Index should use a store-release barrier when written to.
Multiple isolates might lazily compute the index for const sets and
maps. This is fine because all identityHashCodes and hashCodes are
guaranteed to be race-free. The later isolates will override the index
pointer with an identical index.
This CL does not introduce support for using these immutable maps and
sets in AOT (clustered_snapshot) and in messages to other isolates
(message_snapshot) because that is harder to test with unit tests. That
will be added in the follow-up CL.
Design doc: go/dart-vm-const-maps
TEST=runtime/vm/object_test.cc
Bug: https://github.com/dart-lang/sdk/issues/45908
Change-Id: I4042179c15e8b37692d3255655351c01c7124991
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210860
Reviewed-by: Martin Kustermann <kustermann@google.com>
2021-09-06 06:28:59 +00:00
|
|
|
#define CLASS_LIST_MAPS(V) \
|
|
|
|
V(LinkedHashMap) \
|
|
|
|
V(ImmutableLinkedHashMap)
|
[vm] Recognize non-const Set in the VM
`_CompactLinkedHashSet` now extends `_HashVMBase`. The class hierarchy
is organized as mixins similar to LinkedHashMap to accomodate for the
other Sets not extending `_HashVMBase`.
Also, rearranges some code so that introducing ImmutableHashMap and
ImmutableHashSet is easier.
1) snapshot.h and snapshot.cc now have a MapReadFrom, MapWriteTo,
SetReadFrom, and SetWriteTo to facilitate code sharing between
mutable and immutable implementations similar to ArrayReadFrom and
ArrayWriteTo.
2) Macros for CLASS_LIST_MAPS and CLASS_LIST_SETS to facilitate
treating mutable and immutable implementations with the same handle.
Also similar to Array.
Clustered snapshots for HashMaps is currently dead code. This CL makes
it explicit by marking these as unreachable. Immutable maps and sets
will end up in the clustered snapshot in follow up CLs.
Bug: https://github.com/dart-lang/sdk/issues/36077
Bug: https://github.com/dart-lang/sdk/issues/45908
TEST=runtime/vm/object_test.cc
TEST=tests/**_test.dart on many bots
Change-Id: If3cc5ebb3138535aeb0d5e06d9da3d1c9fb2deb2
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206222
Reviewed-by: Tess Strickland <sstrickl@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2021-07-12 09:36:19 +00:00
|
|
|
|
[vm] Introduce immutable maps and sets in backend
This CL introduces immutable maps and sets in the VM backend but does
not yet target them from the frontend. The changes are tested by unit
tests constructing these immutable maps and sets.
This CL introduces immutable variants of the hash map and set in
compact_hash.dart and recognizes them in the VM. The immutable ones
use a different mixin with a different recognized method for accessing
members.
* Data list is an immutable list with a different cid. (Otherwise the
optimizer notices that immutable and mutable lists cannot be equal.)
* Index is a nullable mutable typed data. (Otherwise optimizer removes
necessary null checks.)
* Index should use a store-release barrier when written to.
Multiple isolates might lazily compute the index for const sets and
maps. This is fine because all identityHashCodes and hashCodes are
guaranteed to be race-free. The later isolates will override the index
pointer with an identical index.
This CL does not introduce support for using these immutable maps and
sets in AOT (clustered_snapshot) and in messages to other isolates
(message_snapshot) because that is harder to test with unit tests. That
will be added in the follow-up CL.
Design doc: go/dart-vm-const-maps
TEST=runtime/vm/object_test.cc
Bug: https://github.com/dart-lang/sdk/issues/45908
Change-Id: I4042179c15e8b37692d3255655351c01c7124991
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210860
Reviewed-by: Martin Kustermann <kustermann@google.com>
2021-09-06 06:28:59 +00:00
|
|
|
#define CLASS_LIST_SETS(V) \
|
|
|
|
V(LinkedHashSet) \
|
|
|
|
V(ImmutableLinkedHashSet)
|
[vm] Recognize non-const Set in the VM
`_CompactLinkedHashSet` now extends `_HashVMBase`. The class hierarchy
is organized as mixins similar to LinkedHashMap to accomodate for the
other Sets not extending `_HashVMBase`.
Also, rearranges some code so that introducing ImmutableHashMap and
ImmutableHashSet is easier.
1) snapshot.h and snapshot.cc now have a MapReadFrom, MapWriteTo,
SetReadFrom, and SetWriteTo to facilitate code sharing between
mutable and immutable implementations similar to ArrayReadFrom and
ArrayWriteTo.
2) Macros for CLASS_LIST_MAPS and CLASS_LIST_SETS to facilitate
treating mutable and immutable implementations with the same handle.
Also similar to Array.
Clustered snapshots for HashMaps is currently dead code. This CL makes
it explicit by marking these as unreachable. Immutable maps and sets
will end up in the clustered snapshot in follow up CLs.
Bug: https://github.com/dart-lang/sdk/issues/36077
Bug: https://github.com/dart-lang/sdk/issues/45908
TEST=runtime/vm/object_test.cc
TEST=tests/**_test.dart on many bots
Change-Id: If3cc5ebb3138535aeb0d5e06d9da3d1c9fb2deb2
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206222
Reviewed-by: Tess Strickland <sstrickl@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2021-07-12 09:36:19 +00:00
|
|
|
|
2021-08-16 22:52:21 +00:00
|
|
|
#define CLASS_LIST_FIXED_LENGTH_ARRAYS(V) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Array) \
|
|
|
|
V(ImmutableArray)
|
|
|
|
|
2021-08-16 22:52:21 +00:00
|
|
|
#define CLASS_LIST_ARRAYS(V) \
|
|
|
|
CLASS_LIST_FIXED_LENGTH_ARRAYS(V) \
|
|
|
|
V(GrowableObjectArray)
|
|
|
|
|
2019-01-25 16:45:13 +00:00
|
|
|
#define CLASS_LIST_STRINGS(V) \
|
|
|
|
V(String) \
|
|
|
|
V(OneByteString) \
|
|
|
|
V(TwoByteString) \
|
|
|
|
V(ExternalOneByteString) \
|
|
|
|
V(ExternalTwoByteString)
|
|
|
|
|
|
|
|
#define CLASS_LIST_TYPED_DATA(V) \
|
|
|
|
V(Int8Array) \
|
|
|
|
V(Uint8Array) \
|
|
|
|
V(Uint8ClampedArray) \
|
|
|
|
V(Int16Array) \
|
|
|
|
V(Uint16Array) \
|
|
|
|
V(Int32Array) \
|
|
|
|
V(Uint32Array) \
|
|
|
|
V(Int64Array) \
|
|
|
|
V(Uint64Array) \
|
|
|
|
V(Float32Array) \
|
|
|
|
V(Float64Array) \
|
|
|
|
V(Float32x4Array) \
|
|
|
|
V(Int32x4Array) \
|
|
|
|
V(Float64x2Array)
|
|
|
|
|
[vm/ffi] Optimize `Pointer<T>.asTypedList()`
This change refactors `_asExternalTypedData` into multiple functions,
which are data type specific, e.g `_asExternalTypedDataInt8`.
These functions are implemented as recognized methods.
Argument checks have previously been performed in the removed
runtime entry implementation of `_asExternalTypedData.` These are
now handled in Dart.
TEST=tests/ffi/external_typed_data_test.dart
Closes https://github.com/dart-lang/sdk/issues/39843
Closes https://github.com/dart-lang/sdk/pull/47780
https://github.com/dart-lang/sdk/pull/47780
GitOrigin-RevId: 65763bddd06c633583b4adbf920c32c5a7a3720f
Change-Id: I703b350d89004ebe36e70eaa44dda1d9ebb050c7
Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-debug-arm-try,app-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-linux-debug-ia32-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221360
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2021-11-29 17:38:04 +00:00
|
|
|
#define CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V) \
|
2019-02-13 12:42:47 +00:00
|
|
|
V(Int8) \
|
|
|
|
V(Int16) \
|
|
|
|
V(Int32) \
|
|
|
|
V(Int64) \
|
|
|
|
V(Uint8) \
|
|
|
|
V(Uint16) \
|
|
|
|
V(Uint32) \
|
|
|
|
V(Uint64) \
|
|
|
|
V(Float) \
|
Reland "[vm/ffi] Optimize Pointer operations for statically known types"
Original CL in patchset 1.
Fix for simdbc in patchset 4.
Fix for arm32 precompiled in: https://dart-review.googlesource.com/c/sdk/+/120660/
This CL optimizes Pointer operations in hot loops for Pointer<NativeInteger/NativeDouble/Pointer> (not for structs).
Design: go/dart-ffi-pointers-il
It provides roughly a 100x speedup for the FfiMemory benchmark. The next 5x speedup is to get rid of allocations due to `load` and `store` not being inlined.
FFI API is changed to enable optimizations:
* Disable dynamic invocations of Pointer.load / Pointer.store.
* Disallow implicit downcast of argument passed to Pointer.store.
* Stop zeroing out Pointer.address on Pointer.free().
Issue: https://github.com/dart-lang/sdk/issues/38172
Related issues:
Closes: https://github.com/dart-lang/sdk/issues/35902 (Disallowing dynamic invocations of Pointer ops.)
Closes: https://github.com/dart-lang/sdk/issues/37385 (Function variance checking)
Change-Id: I3921a595fd05026d6ca565ace496771d7c1d877b
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120661
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 13:04:39 +00:00
|
|
|
V(Double)
|
|
|
|
|
|
|
|
#define CLASS_LIST_FFI_TYPE_MARKER(V) \
|
[vm/ffi] Implement `IntPtr` as `AbiSpecificInteger`
Closes: https://github.com/dart-lang/sdk/issues/47938
TEST=tests/ffi*
Change-Id: I78cef41522813569f7e09ce31ce74ba615c070ed
Cq-Include-Trybots: luci.dart.try:analyzer-linux-release-try,analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,benchmark-linux-try,dart-sdk-linux-try,front-end-linux-release-x64-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-fuchsia-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64c-try,vm-kernel-mac-debug-x64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/227162
Reviewed-by: Martin Kustermann <kustermann@google.com>
2022-01-11 22:04:15 +00:00
|
|
|
CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V) \
|
[vm/ffi] Convert Objects to Dart_Handles in FFI calls
This includes support for calling Dart_PropagateError in native code
when doing FFI calls, and catching uncaught exceptions with Dart_IsError
when doing FFI callbacks.
The support for Dart_PropagateError adds a catch entry to the FFI
trampoline, which prevents inlining these trampolines in AOT. This
regresses the FfiCall benchmarks by 1-2% in AOT.
In addition, Dart_PropagateError requires maintaining a bit whether we
entered native/VM code from generated code through FFI or not. That way
we can do the proper transition on the exception path. When entering
generated code, we store this bit on the stack, right after the entry
frame.
Design: http://go/dart-ffi-handles
Issue: https://github.com/dart-lang/sdk/issues/36858
Issue: https://github.com/dart-lang/sdk/issues/41319
Change-Id: Idfd7ff69132fb29cc730931a4113d914d4437396
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,dart-sdk-linux-try,analyzer-analysis-server-linux-try,analyzer-linux-release-try,front-end-linux-release-x64-try,vm-kernel-precomp-win-release-x64-try,vm-kernel-mac-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-nnbd-linux-debug-x64-try,analyzer-nnbd-linux-release-try,front-end-nnbd-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/145591
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-06-12 11:14:22 +00:00
|
|
|
V(Void) \
|
[vm/ffi] Add `Bool`
This CL adds the `Bool` `NativeType` with support for loading/storing
from `Pointer<Bool>`, `Array<Bool>`, and `Struct` and `Union` fields,
and support for passing booleans through FFI calls and callbacks.
The assumption is that `bool` is always treated as `uint8_t` in the
native ABIs. Including: (1) whether there can be garbage in the upper
bytes in CPU registers, (2) stack alignment, and (3) alignment in
compounds.
The conversion from `bool` to `uint8_t` is implemented as follows:
- bool to int: `value ? 1 : 0`
- int to bool: `value != 0`
The conversion is implemented in Dart in patch files for memory loads
and stores (pointer, array, and struct fields) and kernel_to_il for
FFI call and callback arguments and return value.
TEST=runtime/vm/compiler/ffi/native_type_vm_test.cc
TEST=tests/ffi/bool_test.dart
TEST=tests/ffi/function_callbacks_structs_by_value_generated_test.dart
TEST=tests/ffi/function_structs_by_value_generated_test.dart
Closes: https://github.com/dart-lang/sdk/issues/36855
Change-Id: I75d100340ba41771abfb41c598ca92066a89370b
Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-x64-try,vm-ffi-android-debug-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-ffi-android-debug-arm64c-try,vm-kernel-mac-release-arm64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-android-release-arm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/216900
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Clement Skau <cskau@google.com>
2021-10-18 10:44:11 +00:00
|
|
|
V(Handle) \
|
|
|
|
V(Bool)
|
2019-02-13 12:42:47 +00:00
|
|
|
|
|
|
|
#define CLASS_LIST_FFI(V) \
|
|
|
|
V(NativeFunction) \
|
|
|
|
CLASS_LIST_FFI_TYPE_MARKER(V) \
|
|
|
|
V(NativeType) \
|
2019-07-02 23:12:13 +00:00
|
|
|
V(Struct)
|
2019-02-13 12:42:47 +00:00
|
|
|
|
2019-01-25 16:45:13 +00:00
|
|
|
#define DART_CLASS_LIST_TYPED_DATA(V) \
|
|
|
|
V(Int8) \
|
|
|
|
V(Uint8) \
|
|
|
|
V(Uint8Clamped) \
|
|
|
|
V(Int16) \
|
|
|
|
V(Uint16) \
|
|
|
|
V(Int32) \
|
|
|
|
V(Uint32) \
|
|
|
|
V(Int64) \
|
|
|
|
V(Uint64) \
|
|
|
|
V(Float32) \
|
|
|
|
V(Float64) \
|
|
|
|
V(Float32x4) \
|
|
|
|
V(Int32x4) \
|
|
|
|
V(Float64x2)
|
|
|
|
|
|
|
|
#define CLASS_LIST_FOR_HANDLES(V) \
|
[vm] Recognize non-const Set in the VM
`_CompactLinkedHashSet` now extends `_HashVMBase`. The class hierarchy
is organized as mixins similar to LinkedHashMap to accomodate for the
other Sets not extending `_HashVMBase`.
Also, rearranges some code so that introducing ImmutableHashMap and
ImmutableHashSet is easier.
1) snapshot.h and snapshot.cc now have a MapReadFrom, MapWriteTo,
SetReadFrom, and SetWriteTo to facilitate code sharing between
mutable and immutable implementations similar to ArrayReadFrom and
ArrayWriteTo.
2) Macros for CLASS_LIST_MAPS and CLASS_LIST_SETS to facilitate
treating mutable and immutable implementations with the same handle.
Also similar to Array.
Clustered snapshots for HashMaps is currently dead code. This CL makes
it explicit by marking these as unreachable. Immutable maps and sets
will end up in the clustered snapshot in follow up CLs.
Bug: https://github.com/dart-lang/sdk/issues/36077
Bug: https://github.com/dart-lang/sdk/issues/45908
TEST=runtime/vm/object_test.cc
TEST=tests/**_test.dart on many bots
Change-Id: If3cc5ebb3138535aeb0d5e06d9da3d1c9fb2deb2
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206222
Reviewed-by: Tess Strickland <sstrickl@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2021-07-12 09:36:19 +00:00
|
|
|
CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY_NOR_MAP(V) \
|
|
|
|
V(LinkedHashMap) \
|
|
|
|
V(LinkedHashSet) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(Array) \
|
2021-08-16 22:52:21 +00:00
|
|
|
V(GrowableObjectArray) \
|
2019-01-25 16:45:13 +00:00
|
|
|
V(String)
|
|
|
|
|
|
|
|
#define CLASS_LIST_NO_OBJECT(V) \
|
[vm] Recognize non-const Set in the VM
`_CompactLinkedHashSet` now extends `_HashVMBase`. The class hierarchy
is organized as mixins similar to LinkedHashMap to accomodate for the
other Sets not extending `_HashVMBase`.
Also, rearranges some code so that introducing ImmutableHashMap and
ImmutableHashSet is easier.
1) snapshot.h and snapshot.cc now have a MapReadFrom, MapWriteTo,
SetReadFrom, and SetWriteTo to facilitate code sharing between
mutable and immutable implementations similar to ArrayReadFrom and
ArrayWriteTo.
2) Macros for CLASS_LIST_MAPS and CLASS_LIST_SETS to facilitate
treating mutable and immutable implementations with the same handle.
Also similar to Array.
Clustered snapshots for HashMaps is currently dead code. This CL makes
it explicit by marking these as unreachable. Immutable maps and sets
will end up in the clustered snapshot in follow up CLs.
Bug: https://github.com/dart-lang/sdk/issues/36077
Bug: https://github.com/dart-lang/sdk/issues/45908
TEST=runtime/vm/object_test.cc
TEST=tests/**_test.dart on many bots
Change-Id: If3cc5ebb3138535aeb0d5e06d9da3d1c9fb2deb2
Cq-Include-Trybots: luci.dart.try:analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,dart-sdk-linux-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-simarm64c-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206222
Reviewed-by: Tess Strickland <sstrickl@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2021-07-12 09:36:19 +00:00
|
|
|
CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY_NOR_MAP(V) \
|
|
|
|
CLASS_LIST_MAPS(V) \
|
|
|
|
CLASS_LIST_SETS(V) \
|
2019-01-25 16:45:13 +00:00
|
|
|
CLASS_LIST_ARRAYS(V) \
|
|
|
|
CLASS_LIST_STRINGS(V)
|
|
|
|
|
|
|
|
#define CLASS_LIST(V) \
|
|
|
|
V(Object) \
|
|
|
|
CLASS_LIST_NO_OBJECT(V)
|
|
|
|
|
2020-05-04 21:15:27 +00:00
|
|
|
enum ClassId : intptr_t {
|
2019-01-25 16:45:13 +00:00
|
|
|
// Illegal class id.
|
|
|
|
kIllegalCid = 0,
|
|
|
|
|
2021-08-27 17:45:17 +00:00
|
|
|
// Pseudo class id for native pointers, the heap should never see an
|
|
|
|
// object with this class id.
|
|
|
|
kNativePointer,
|
|
|
|
|
2019-01-25 16:45:13 +00:00
|
|
|
// The following entries describes classes for pseudo-objects in the heap
|
|
|
|
// that should never be reachable from live objects. Free list elements
|
|
|
|
// maintain the free list for old space, and forwarding corpses are used to
|
|
|
|
// implement one-way become.
|
|
|
|
kFreeListElement,
|
|
|
|
kForwardingCorpse,
|
|
|
|
|
|
|
|
// List of Ids for predefined classes.
|
|
|
|
#define DEFINE_OBJECT_KIND(clazz) k##clazz##Cid,
|
|
|
|
CLASS_LIST(DEFINE_OBJECT_KIND)
|
|
|
|
#undef DEFINE_OBJECT_KIND
|
|
|
|
|
2019-04-03 12:04:23 +00:00
|
|
|
// clang-format off
|
2019-04-03 12:50:57 +00:00
|
|
|
#define DEFINE_OBJECT_KIND(clazz) kFfi##clazz##Cid,
|
|
|
|
CLASS_LIST_FFI(DEFINE_OBJECT_KIND)
|
2019-01-25 16:45:13 +00:00
|
|
|
#undef DEFINE_OBJECT_KIND
|
|
|
|
|
2019-04-03 12:50:57 +00:00
|
|
|
#define DEFINE_OBJECT_KIND(clazz) \
|
|
|
|
kTypedData##clazz##Cid, \
|
|
|
|
kTypedData##clazz##ViewCid, \
|
|
|
|
kExternalTypedData##clazz##Cid,
|
2019-01-25 16:45:13 +00:00
|
|
|
CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
|
|
|
|
#undef DEFINE_OBJECT_KIND
|
|
|
|
kByteDataViewCid,
|
|
|
|
|
|
|
|
kByteBufferCid,
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
// The following entries do not describe a predefined class, but instead
|
2019-11-01 00:43:59 +00:00
|
|
|
// are class indexes for pre-allocated instances (Null, dynamic, void, Never).
|
2019-01-25 16:45:13 +00:00
|
|
|
kNullCid,
|
|
|
|
kDynamicCid,
|
|
|
|
kVoidCid,
|
2019-11-01 00:43:59 +00:00
|
|
|
kNeverCid,
|
2019-01-25 16:45:13 +00:00
|
|
|
|
|
|
|
kNumPredefinedCids,
|
|
|
|
};
|
|
|
|
|
2019-04-03 12:50:57 +00:00
|
|
|
// Keep these in sync with the cid numbering above.
|
|
|
|
const int kTypedDataCidRemainderInternal = 0;
|
|
|
|
const int kTypedDataCidRemainderView = 1;
|
|
|
|
const int kTypedDataCidRemainderExternal = 2;
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
// Class Id predicates.
|
|
|
|
|
2021-08-13 20:00:41 +00:00
|
|
|
bool IsInternalOnlyClassId(intptr_t index);
|
2020-04-21 20:09:55 +00:00
|
|
|
bool IsErrorClassId(intptr_t index);
|
|
|
|
bool IsNumberClassId(intptr_t index);
|
|
|
|
bool IsIntegerClassId(intptr_t index);
|
|
|
|
bool IsStringClassId(intptr_t index);
|
|
|
|
bool IsOneByteStringClassId(intptr_t index);
|
|
|
|
bool IsExternalStringClassId(intptr_t index);
|
|
|
|
bool IsBuiltinListClassId(intptr_t index);
|
2021-01-07 23:45:37 +00:00
|
|
|
bool IsTypeClassId(intptr_t index);
|
2020-04-21 20:09:55 +00:00
|
|
|
bool IsTypedDataBaseClassId(intptr_t index);
|
|
|
|
bool IsTypedDataClassId(intptr_t index);
|
|
|
|
bool IsTypedDataViewClassId(intptr_t index);
|
|
|
|
bool IsExternalTypedDataClassId(intptr_t index);
|
|
|
|
bool IsFfiPointerClassId(intptr_t index);
|
|
|
|
bool IsFfiTypeClassId(intptr_t index);
|
|
|
|
bool IsFfiDynamicLibraryClassId(intptr_t index);
|
|
|
|
bool IsInternalVMdefinedClassId(intptr_t index);
|
|
|
|
bool IsImplicitFieldClassId(intptr_t index);
|
|
|
|
|
2021-08-13 13:27:41 +00:00
|
|
|
// Should be used for looping over non-Object internal-only cids.
|
|
|
|
constexpr intptr_t kFirstInternalOnlyCid = kClassCid;
|
|
|
|
constexpr intptr_t kLastInternalOnlyCid = kUnwindErrorCid;
|
|
|
|
// Use the currently surrounding cids to check that no new classes have been
|
|
|
|
// added to the beginning or end of CLASS_LIST_INTERNAL_ONLY without adjusting
|
|
|
|
// the above definitions.
|
|
|
|
COMPILE_ASSERT(kFirstInternalOnlyCid == kObjectCid + 1);
|
|
|
|
COMPILE_ASSERT(kInstanceCid == kLastInternalOnlyCid + 1);
|
|
|
|
|
|
|
|
// Returns true for any class id that either does not correspond to a real
|
|
|
|
// class, like kIllegalCid or kForwardingCorpse, or that is internal to the VM
|
|
|
|
// and should not be exposed directly to user code.
|
2021-08-13 20:00:41 +00:00
|
|
|
inline bool IsInternalOnlyClassId(intptr_t index) {
|
|
|
|
// Fix the condition below if these become non-contiguous.
|
2021-08-27 17:45:17 +00:00
|
|
|
COMPILE_ASSERT(kIllegalCid + 1 == kNativePointer &&
|
|
|
|
kIllegalCid + 2 == kFreeListElement &&
|
|
|
|
kIllegalCid + 3 == kForwardingCorpse &&
|
|
|
|
kIllegalCid + 4 == kObjectCid &&
|
|
|
|
kIllegalCid + 5 == kFirstInternalOnlyCid);
|
2021-08-13 13:27:41 +00:00
|
|
|
return index <= kLastInternalOnlyCid;
|
|
|
|
}
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
inline bool IsErrorClassId(intptr_t index) {
|
|
|
|
// Make sure this function is updated when new Error types are added.
|
2021-08-13 13:27:41 +00:00
|
|
|
COMPILE_ASSERT(kApiErrorCid == kErrorCid + 1 &&
|
|
|
|
kLanguageErrorCid == kErrorCid + 2 &&
|
|
|
|
kUnhandledExceptionCid == kErrorCid + 3 &&
|
|
|
|
kUnwindErrorCid == kErrorCid + 4 &&
|
2021-08-13 20:00:41 +00:00
|
|
|
// Change if needed for detecting a new error added at the end.
|
2021-08-13 13:27:41 +00:00
|
|
|
kLastInternalOnlyCid == kUnwindErrorCid);
|
2021-08-13 20:00:41 +00:00
|
|
|
return (index >= kErrorCid && index <= kUnwindErrorCid);
|
2020-04-21 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsNumberClassId(intptr_t index) {
|
|
|
|
// Make sure this function is updated when new Number types are added.
|
|
|
|
COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 && kSmiCid == kNumberCid + 2 &&
|
|
|
|
kMintCid == kNumberCid + 3 && kDoubleCid == kNumberCid + 4);
|
|
|
|
return (index >= kNumberCid && index <= kDoubleCid);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsIntegerClassId(intptr_t index) {
|
|
|
|
// Make sure this function is updated when new Integer types are added.
|
|
|
|
COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 && kMintCid == kIntegerCid + 2);
|
|
|
|
return (index >= kIntegerCid && index <= kMintCid);
|
|
|
|
}
|
|
|
|
|
2021-04-13 09:53:07 +00:00
|
|
|
// Make sure this check is updated when new StringCid types are added.
|
|
|
|
COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
|
|
|
|
kTwoByteStringCid == kStringCid + 2 &&
|
|
|
|
kExternalOneByteStringCid == kStringCid + 3 &&
|
|
|
|
kExternalTwoByteStringCid == kStringCid + 4);
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
inline bool IsStringClassId(intptr_t index) {
|
|
|
|
return (index >= kStringCid && index <= kExternalTwoByteStringCid);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsOneByteStringClassId(intptr_t index) {
|
|
|
|
return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsExternalStringClassId(intptr_t index) {
|
|
|
|
return (index == kExternalOneByteStringCid ||
|
|
|
|
index == kExternalTwoByteStringCid);
|
|
|
|
}
|
|
|
|
|
2021-08-16 22:52:21 +00:00
|
|
|
inline bool IsArrayClassId(intptr_t index) {
|
|
|
|
COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1);
|
|
|
|
COMPILE_ASSERT(kGrowableObjectArrayCid == kArrayCid + 2);
|
|
|
|
return (index >= kArrayCid && index <= kGrowableObjectArrayCid);
|
|
|
|
}
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
inline bool IsBuiltinListClassId(intptr_t index) {
|
|
|
|
// Make sure this function is updated when new builtin List types are added.
|
2021-08-16 22:52:21 +00:00
|
|
|
return (IsArrayClassId(index) || IsTypedDataBaseClassId(index) ||
|
2020-04-21 20:09:55 +00:00
|
|
|
(index == kByteBufferCid));
|
|
|
|
}
|
|
|
|
|
2021-01-07 23:45:37 +00:00
|
|
|
inline bool IsTypeClassId(intptr_t index) {
|
|
|
|
// Only Type and FunctionType can be encountered as instance types at runtime.
|
|
|
|
return index == kTypeCid || index == kFunctionTypeCid;
|
|
|
|
}
|
|
|
|
|
2020-04-21 20:09:55 +00:00
|
|
|
inline bool IsTypedDataBaseClassId(intptr_t index) {
|
|
|
|
// Make sure this is updated when new TypedData types are added.
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 3 == kTypedDataUint8ArrayCid);
|
|
|
|
return index >= kTypedDataInt8ArrayCid && index < kByteDataViewCid;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsTypedDataClassId(intptr_t index) {
|
|
|
|
// Make sure this is updated when new TypedData types are added.
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 3 == kTypedDataUint8ArrayCid);
|
|
|
|
return IsTypedDataBaseClassId(index) && ((index - kTypedDataInt8ArrayCid) %
|
|
|
|
3) == kTypedDataCidRemainderInternal;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsTypedDataViewClassId(intptr_t index) {
|
|
|
|
// Make sure this is updated when new TypedData types are added.
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayViewCid + 3 == kTypedDataUint8ArrayViewCid);
|
|
|
|
|
|
|
|
const bool is_byte_data_view = index == kByteDataViewCid;
|
|
|
|
return is_byte_data_view ||
|
|
|
|
(IsTypedDataBaseClassId(index) &&
|
|
|
|
((index - kTypedDataInt8ArrayCid) % 3) == kTypedDataCidRemainderView);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsExternalTypedDataClassId(intptr_t index) {
|
|
|
|
// Make sure this is updated when new TypedData types are added.
|
|
|
|
COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid + 3 ==
|
|
|
|
kExternalTypedDataUint8ArrayCid);
|
|
|
|
|
|
|
|
return IsTypedDataBaseClassId(index) && ((index - kTypedDataInt8ArrayCid) %
|
|
|
|
3) == kTypedDataCidRemainderExternal;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsFfiTypeClassId(intptr_t index) {
|
2020-11-19 13:29:09 +00:00
|
|
|
switch (index) {
|
2021-09-08 11:58:55 +00:00
|
|
|
case kPointerCid:
|
2020-11-19 13:29:09 +00:00
|
|
|
case kFfiNativeFunctionCid:
|
|
|
|
#define CASE_FFI_CID(name) case kFfi##name##Cid:
|
|
|
|
CLASS_LIST_FFI_TYPE_MARKER(CASE_FFI_CID)
|
|
|
|
#undef CASE_FFI_CID
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
UNREACHABLE();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsFfiPredefinedClassId(classid_t class_id) {
|
|
|
|
switch (class_id) {
|
2021-09-08 11:58:55 +00:00
|
|
|
case kPointerCid:
|
|
|
|
case kDynamicLibraryCid:
|
2020-11-19 13:29:09 +00:00
|
|
|
#define CASE_FFI_CID(name) case kFfi##name##Cid:
|
[vm/ffi] Add `Bool`
This CL adds the `Bool` `NativeType` with support for loading/storing
from `Pointer<Bool>`, `Array<Bool>`, and `Struct` and `Union` fields,
and support for passing booleans through FFI calls and callbacks.
The assumption is that `bool` is always treated as `uint8_t` in the
native ABIs. Including: (1) whether there can be garbage in the upper
bytes in CPU registers, (2) stack alignment, and (3) alignment in
compounds.
The conversion from `bool` to `uint8_t` is implemented as follows:
- bool to int: `value ? 1 : 0`
- int to bool: `value != 0`
The conversion is implemented in Dart in patch files for memory loads
and stores (pointer, array, and struct fields) and kernel_to_il for
FFI call and callback arguments and return value.
TEST=runtime/vm/compiler/ffi/native_type_vm_test.cc
TEST=tests/ffi/bool_test.dart
TEST=tests/ffi/function_callbacks_structs_by_value_generated_test.dart
TEST=tests/ffi/function_structs_by_value_generated_test.dart
Closes: https://github.com/dart-lang/sdk/issues/36855
Change-Id: I75d100340ba41771abfb41c598ca92066a89370b
Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-x64-try,vm-ffi-android-debug-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-ffi-android-debug-arm64c-try,vm-kernel-mac-release-arm64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-android-release-arm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/216900
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Clement Skau <cskau@google.com>
2021-10-18 10:44:11 +00:00
|
|
|
CLASS_LIST_FFI(CASE_FFI_CID)
|
2020-11-19 13:29:09 +00:00
|
|
|
#undef CASE_FFI_CID
|
[vm/ffi] Add `Bool`
This CL adds the `Bool` `NativeType` with support for loading/storing
from `Pointer<Bool>`, `Array<Bool>`, and `Struct` and `Union` fields,
and support for passing booleans through FFI calls and callbacks.
The assumption is that `bool` is always treated as `uint8_t` in the
native ABIs. Including: (1) whether there can be garbage in the upper
bytes in CPU registers, (2) stack alignment, and (3) alignment in
compounds.
The conversion from `bool` to `uint8_t` is implemented as follows:
- bool to int: `value ? 1 : 0`
- int to bool: `value != 0`
The conversion is implemented in Dart in patch files for memory loads
and stores (pointer, array, and struct fields) and kernel_to_il for
FFI call and callback arguments and return value.
TEST=runtime/vm/compiler/ffi/native_type_vm_test.cc
TEST=tests/ffi/bool_test.dart
TEST=tests/ffi/function_callbacks_structs_by_value_generated_test.dart
TEST=tests/ffi/function_structs_by_value_generated_test.dart
Closes: https://github.com/dart-lang/sdk/issues/36855
Change-Id: I75d100340ba41771abfb41c598ca92066a89370b
Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-x64-try,vm-ffi-android-debug-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-ffi-android-debug-arm64c-try,vm-kernel-mac-release-arm64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-android-release-arm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/216900
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Clement Skau <cskau@google.com>
2021-10-18 10:44:11 +00:00
|
|
|
return true;
|
2020-11-19 13:29:09 +00:00
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
UNREACHABLE();
|
2020-04-21 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsFfiPointerClassId(intptr_t index) {
|
2021-09-08 11:58:55 +00:00
|
|
|
return index == kPointerCid;
|
2020-04-21 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsFfiDynamicLibraryClassId(intptr_t index) {
|
2021-09-08 11:58:55 +00:00
|
|
|
return index == kDynamicLibraryCid;
|
2020-04-21 20:09:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool IsInternalVMdefinedClassId(intptr_t index) {
|
|
|
|
return ((index < kNumPredefinedCids) && !IsImplicitFieldClassId(index));
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is a set of classes that are not Dart classes whose representation
|
|
|
|
// is defined by the VM but are used in the VM code by computing the
|
|
|
|
// implicit field offsets of the various fields in the dart object.
|
|
|
|
inline bool IsImplicitFieldClassId(intptr_t index) {
|
|
|
|
return index == kByteBufferCid;
|
|
|
|
}
|
|
|
|
|
2021-04-13 09:53:07 +00:00
|
|
|
// Make sure the following checks are updated when adding new TypedData types.
|
|
|
|
|
|
|
|
// Ensure that each typed data type comes in internal/view/external variants
|
|
|
|
// next to each other.
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 1 == kTypedDataInt8ArrayViewCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 2 == kExternalTypedDataInt8ArrayCid);
|
|
|
|
|
|
|
|
// Ensure the order of the typed data members in 3-step.
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 1 * 3 == kTypedDataUint8ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 2 * 3 ==
|
|
|
|
kTypedDataUint8ClampedArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 3 * 3 == kTypedDataInt16ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 4 * 3 == kTypedDataUint16ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 5 * 3 == kTypedDataInt32ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 6 * 3 == kTypedDataUint32ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 7 * 3 == kTypedDataInt64ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 8 * 3 == kTypedDataUint64ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 9 * 3 == kTypedDataFloat32ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 10 * 3 == kTypedDataFloat64ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 11 * 3 == kTypedDataFloat32x4ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 12 * 3 == kTypedDataInt32x4ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 13 * 3 == kTypedDataFloat64x2ArrayCid);
|
|
|
|
COMPILE_ASSERT(kTypedDataInt8ArrayCid + 14 * 3 == kByteDataViewCid);
|
|
|
|
COMPILE_ASSERT(kByteBufferCid + 1 == kNullCid);
|
2020-04-21 20:09:55 +00:00
|
|
|
|
2019-01-25 16:45:13 +00:00
|
|
|
} // namespace dart
|
|
|
|
|
|
|
|
#endif // RUNTIME_VM_CLASS_ID_H_
|