Commit Graph

15267 Commits

Author SHA1 Message Date
Jonas Termansen 37b2209722 [vm] Remove timer non-zero assertions.
For some reason, these assertions fire when snapshots are trained on RBE
inside a docker container. It's potentially a race condition if the
timer resolution is low enough or RBE is lying about the time. However,
there is no need to check if the start time is non-zero since there's
already a running_ variable protecting against stopping times that
haven't been started.

TEST=CQ, locally, and on RBE

Bug: b/296994239
Change-Id: I2a5b36d0b1cb9b939e94fe6aabb5f41fec077f2a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/342401
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Jonas Termansen <sortie@google.com>
2023-12-18 17:01:18 +00:00
Alexander Markov 5bff7fa6a3 [vm/aot] Keep import graph connected when tree-shaking libraries
TEST=pkg/vm/testcases/transformations/type_flow/transformer/regress_54324.dart
Fixes https://github.com/dart-lang/sdk/issues/54324

Change-Id: Ifefb490dfd5f4fea7b94d1841385a9761f258ba8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341783
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2023-12-15 17:17:29 +00:00
Ryan Macnak 04d606aaff [vm] Account for --no_retain_function_objects in Code::Name.
TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/54344
Change-Id: Ic72b877efaf36a5b68285caa595604e203ea83b9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341821
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-12-15 17:08:56 +00:00
Ben Konyi 9a96a8eb97 [ VM ] Fix timestamp overflow when building Perfetto protos on IA32
Fixes https://github.com/dart-lang/sdk/issues/54290

TEST=pkg/vm_service/test/get_perfetto_cpu_samples_rpc_test.dart should start passing on IA32

Change-Id: I826c7e965a88f11b678e1f836eb4140292160e35
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/342060
Reviewed-by: Derek Xu <derekx@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
2023-12-15 16:48:37 +00:00
Alexander Markov dcdfcc2b8d Reland "[vm/ffi] Express FFI call closures explicitly in AST"
This reverts commit 1800039c2a.

The changes fd2e9b9f1a and
c20f9eaf6f are relanded as is.

Reason for revert was fixed separately in
https://dart-review.googlesource.com/c/sdk/+/341621

TEST=ci

CoreLibraryReviewExempt: Implementation change only.
Issue: https://github.com/dart-lang/sdk/issues/54172
Issue: https://github.com/dart-lang/sdk/issues/39692
Change-Id: I1a2324768502e5ffbce328127938c0d3c96c38ba
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341642
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2023-12-15 15:25:29 +00:00
Simon Binder 150e61a662 [vm/ffi] Support @Native fields
Allow annotating top-level or static fields with `@Native` to create
fields backed by native memory.
By using the `_addressOf` operator implemented in the VM, these fields
can be implemented in the CFE by replacing them with accessors looking
up the pointer and then using existing methods to load and store the
value.

Closes https://github.com/dart-lang/sdk/issues/50551

TEST=tests/ffi/native_assets/asset_*_test.dart
TEST=pkg/analyzer/test/src/diagnostics/ffi_native_test.dart

CoreLibraryReviewExempt: VM & dart2wasm only feature
Change-Id: I61dccc88076723d6a6ba02d7fd848b18e4caf780
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338020
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Lasse Nielsen <lrn@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
2023-12-15 11:20:23 +00:00
Ryan Macnak 877dbd7226 [vm, service] Fix heap snapshot generation to account for there no longer being a kMaxImagePages.
With deferred loading, the number of image pages can be arbitrarily large. The compactor already has the analogous change.

TEST=ci
Change-Id: Ie5a1ff0902e56aaebf1d1c679ce26b35e8a03ec3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341781
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-12-14 22:48:49 +00:00
Paul Berry 949f3af120 Remove kernel flag Procedure.isAbstractFieldAccessor.
This used to be used solely by field promotion, to recognize when a
getter arose from a declaration of an abstract field, so that abstract
fields would be promotable but explicitly declared abstract getters
would not be.

However, with the adoption of
https://github.com/dart-lang/language/issues/3328, both abstract
fields and abstract getters are now considered promotable, so there is
no longer any need to distinguish them.

Bug: https://github.com/dart-lang/language/issues/3328
Change-Id: Idc14512568eb0a11dae4e364df453d117adff2e3
Tested: standard presubmit bots
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338643
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2023-12-14 18:06:52 +00:00
Alexander Markov 508cdb51c2 [vm] Fix handling of force-optimized functions in debugger
Force-optimized functions where not consistenly checked when
deoptimizing world and querying local variables in debugger.

TEST=Manual testing of repro from https://github.com/flutter/flutter/issues/140074
Fixes https://github.com/flutter/flutter/issues/140074

Change-Id: I097ea60dd2371757f29d89ffbe5b85119e31e15d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341621
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2023-12-14 18:01:32 +00:00
Ryan Macnak 2d01bf3779 [vm, gc] Interrupt to finalize concurrent marking.
STW marking is no longer O(new-space), so there's no longer a reason to delay finalizing marking hoping for a scavenge to make new-space mostly empty.

TEST=ci
Change-Id: Ie782e88852714d30e0c75aa9aecac62e56c434ce
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/319880
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-12-14 17:27:49 +00:00
Brian Quinlan da0b9aa8b3 Revert "Call tzset() in OS::Init() on Android so localtime_r() has populated timezone information."
This reverts commit 49f6657c37.

Reason for revert: This caused a performance regression in Android startup time.

Original change's description:
> Call tzset() in OS::Init() on Android so localtime_r() has populated timezone information.
>
> POSIX and glibc do not guarantee that timezone setup is done by localtime_r().
>
> Android <= 7.1.1 did *not* do timezone setup in localtime_r(), which means that users will see their timezone as "GMT".
>
> macOS/iOS seem to guarantee that timezone setup is done in localtime_r() but the wording is vague:
>
>   localtime_r() and gmtime_r() functions provide the same functionality
>   as localtime() and gmtime()...
>
> N.B.: localtime() is guaranteed to do timezone setup
>
> Bug:https://github.com/dart-lang/sdk/issues/53276
> Change-Id: I8f6abfbfcf07a61cb341c1dbbd8323440cb8f581
> Tested: manually tested on Android 7.1.1
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340281
> Reviewed-by: Siva Annamalai <asiva@google.com>
> Commit-Queue: Brian Quinlan <bquinlan@google.com>

Bug: https://github.com/dart-lang/sdk/issues/53276
Change-Id: I02ae79d5c3a3f5a3a9003fae71b81ff5a10ac272
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341338
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Commit-Queue: Brian Quinlan <bquinlan@google.com>
Reviewed-by: Derek Xu <derekx@google.com>
2023-12-14 16:33:21 +00:00
Alexander Markov 1800039c2a Revert "[vm/ffi] Express FFI call closures explicitly in AST"
This reverts commit fd2e9b9f1a.

Revert "[vm/ffi] Cleanup FFI call trampolines"

This reverts commit c20f9eaf6f.

Reason: https://github.com/flutter/flutter/issues/140074
TEST=ci
CoreLibraryReviewExempt: Implementation change only.
Change-Id: Ib193d8f015fc66461fe3cc90550a92e1ba65f236
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341620
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Auto-Submit: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
2023-12-14 01:14:58 +00:00
Alexander Markov 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>
2023-12-12 19:19:45 +00:00
Alexander Markov fd2e9b9f1a [vm/ffi] Express FFI call closures explicitly in AST
Instead of implicitly creating closures for FFI
asFunction/lookupFunction APIs in the VM, now they are explicitly expressed in the kernel AST. That makes it possible to analyze
them in TFA.

FFI calls from Dart code into native are now performed in the following way:

```
  block {
    Pointer #ffiTarget0 = target;
    @pragma('vm:ffi:call-closure', _FfiCall<Int32 Function(Int32)>(isLeaf: false))
    #ffiClosure0(int arg1) {
      _nativeEffect(arg1);
      return _ffiCall<int>(#ffiTarget0);
    }
  } =>#ffiClosure0;
```

_ffiCall method is recognized by the VM and its call is replaced
directly with FFI calling sequence. _ffiCall uses closure
parameters implicitly. No extra trampolines are generated for FFI calls.

TEST=existing
Fixes https://github.com/dart-lang/sdk/issues/54172
Issue https://github.com/dart-lang/sdk/issues/39692

CoreLibraryReviewExempt: Implementation change only.
Change-Id: I92b3ff7391470686151ad0807e2cdbbf1a69d256
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339662
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2023-12-12 18:34:39 +00:00
Alexander Markov 804a306895 [vm] Preserve pragma annotations on hot reload
TEST=vm/cc/IsolateReload_KeepPragma{1,2,3}

Change-Id: Ib698b918a27382e3573b5d3f0670d9f4e13c8064
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/341100
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2023-12-12 02:09:27 +00:00
Ryan Macnak a3b7c323b0 [vm, gc] Mark through new-space.
- Initial and final marking no longer visit all of new-space, reducing the STW pause for major GC.
 - A scavenge during concurrent marking must forward / filter objects in the marking worklist that are moved / collected, increasing the STW pause for minor GC.
 - Unreachable intergenerational cycles and weak references are collected in the next mark-sweep instead of first requiring enough scavenges to promote the whole cycle or weak target into old-space.
 - Artificial minor GCs are no longer needed to avoid memory leaks from back-to-back major GCs.
 - reachabilityBarrier is now just a count of major GCs.

TEST=ci
Change-Id: Ic7754e8d972763654eae2b7faa8670735d9cda3f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340644
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-12-12 01:56:15 +00:00
Daco Harkes 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>
2023-12-12 00:05:02 +00:00
Alexander Aprelev 229e8ef687 [gardening] Use RecordType::New() instead of thread-unsafe Object::Clone() in RecordType::ToNullability.
Fixes https://github.com/dart-lang/sdk/issues/54123

TEST=tsan ci

Change-Id: Ie5e326e9400286360c1152c870539cbfd179c8f6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340288
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
2023-12-08 20:13:38 +00:00
Alexander Aprelev 514df6fd60 [gardening] Fix fuchsia build breakage
Follow-up to https://dart.googlesource.com/sdk/+/0ea04d407d74503fb7a7ae581727523ec979a2ed

TEST=ci

Change-Id: I335b3a0bdeed6b0d1d58bf9ea2ec671e7c9cf7c3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340381
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
2023-12-07 17:42:19 +00:00
Jens Johansen c959173b4c [CFE/VM] Expression compilation when inside an extension type method
VM: De-mangle names as done with extension methods.
CFE: Handle #this as with extension methods.

TEST=ci
Change-Id: I512798632a016025bf30edf8a0586d9085b4e3cc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339960
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
2023-12-07 11:15:25 +00:00
Filip Filmar 0ea04d407d [fuchsia] Adds the new ICU tzdata dir /config/tzdata
This is in line with the most up to date Fuchsia namespace
conventions.

TEST=fuchsia tests
Bug: #54176
Change-Id: Ic3891ea9119308052a8abd3d23110c35e270967a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338588
Auto-Submit: Filip Filmar <fmil@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2023-12-07 08:41:14 +00:00
Brian Quinlan 49f6657c37 Call tzset() in OS::Init() on Android so localtime_r() has populated timezone information.
POSIX and glibc do not guarantee that timezone setup is done by localtime_r().

Android <= 7.1.1 did *not* do timezone setup in localtime_r(), which means that users will see their timezone as "GMT".

macOS/iOS seem to guarantee that timezone setup is done in localtime_r() but the wording is vague:

  localtime_r() and gmtime_r() functions provide the same functionality
  as localtime() and gmtime()...

N.B.: localtime() is guaranteed to do timezone setup

Bug:https://github.com/dart-lang/sdk/issues/53276
Change-Id: I8f6abfbfcf07a61cb341c1dbbd8323440cb8f581
Tested: manually tested on Android 7.1.1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340281
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Brian Quinlan <bquinlan@google.com>
2023-12-07 01:34:31 +00:00
Martin Kustermann 4163bb1277 [vm] Do not call isolate group shutdown callback for vm isolate
Closes https://github.com/dart-lang/sdk/issues/54199

TEST=

Change-Id: I1b562a082766a2d02bc9d51f4eca597f4d109caf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339940
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
2023-12-06 08:02:49 +00:00
Ryan Macnak 9c0b1e06db [vm, profiler] Remove race between sample processor and stub code initialization.
TEST=tsan
Bug: https://github.com/dart-lang/sdk/issues/54226
Change-Id: I54ce983acae28474c4a31200922b902dd19cf95d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339643
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-12-05 17:29:05 +00:00
Simon Binder a44a524bb0 [vm/ffi]: Add Native.addressOf
This adds the `Native.addressOf` function, which takes a constant tear-
off of a method annotated with `@Native` as a parameter and returns a
pointer to the underlying C function.

The CFE will resolve these calls in two steps: First, the existing
transformer for `@Native` methods adds a pragma describing the fully-
resolved native annotation (with the asset id inferred from the library
if not given explicitly). Then, the FFI use sites transformer rewrites
calls to `Native.addressOf` by searching for this pragma on the passed
function and passing the `Native` constants to `Native._addressOf`. The
latter method is implemented in the VM, which can re-use existing parts
already used for `@Native` calls.
An alternative implementation strategy would have been to forward
`addressOf` calls to `Native.ffi_resolver_function` directly without
any special consideration in the VM. However, the chosen approach makes
it easier to support static linking in the future, as this requires
unresolved symbols in the generated assembly.

Closes https://github.com/dart-lang/sdk/issues/50552

TEST=pkg/vm/testcases/transformations/ffi/ffinative.dart
TEST=tests/ffi/native_assets/asset_*_test.dart
TEST=tests/ffi/vmspecific_static_checks_ffinative_test.dart
TEST=pkg/analyzer/test/src/diagnostics/ffi_native_test.dart

Cq-Include-Trybots: luci.dart.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-kernel-precomp-linux-release-x64-try
CoreLibraryReviewExempt: VM & dart2wasm only feature
Change-Id: Ic8e3a390146dffd44c95578f975a4472db79a0ee
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/333920
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2023-12-05 13:10:36 +00:00
Alexander Markov 0310e41f2c [vm/ffi] Verify NativeFunctionPointer.asFunction type arguments
Protect VM compiler code from crashing when incorrect
type arguments are passed to FFI _asFunctionInternal.

Also, improve front-end FFI checks to reject Function
as a Dart type corresponding to a NativeFunction<...>
(it should be an actual function type).

TEST=tests/ffi/vmspecific_static_checks_test.dart
Fixes https://github.com/dart-lang/sdk/issues/52730

Change-Id: I02c012bb76d5c94f551da2c725a476b68c0f9db4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339109
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2023-12-01 14:05:59 +00:00
Ryan Macnak 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>
2023-11-30 16:42:28 +00:00
Vyacheslav Egorov 7c4002abe9 [vm] Check for null in typed data stores
Fixes https://github.com/dart-lang/sdk/issues/54195

TEST=standalone/typed_data

Change-Id: I87c890eba381a46b0b33066485bba3fbc3bf1004
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339180
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
2023-11-30 10:15:19 +00:00
Vyacheslav Egorov c260bec877 [vm] Make Dart_DetectNullSafety work for AOT snapshots
R=kustermann@google.com
TEST=manually using internal test

Change-Id: Ic6b2d259b6d1480ac4d5ba543dafe005c1829d3e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339140
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
2023-11-30 09:21:04 +00:00
Ryan Macnak e8fb1ac89d [vm, compiler] Hoist RebaseIfImprovesAddressing up to ParallelMoveResolver.
Allows FFI to reuse FlowGraphCompiler::EmitMove in contexts where the delta between SP and FP isn't accurately described by StackSize.

TEST=dart2js codesize unchanged
Change-Id: Idf0643af3debfc77564672d6d16491990b87611c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/339040
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2023-11-29 22:05:39 +00:00
Alexander Markov 422b66a7e8 [vm/compiler] Relax flow graph checker for environment uses
Conditional constant propagation doesn't update environments and may
also replace redefinition instructions with constants
without updating environment uses of their original definitions.

This causes discrepancy between arguments of a call and its environment.
It is harmless and corresponding check in the flow graph checker can be
relaxed.

TEST=runtime/tests/vm/dart/regress_54128_test.dart
Fixes https://github.com/dart-lang/sdk/issues/54128

Change-Id: I6e68e0525b7f110400435ac071934dd9a02eebd4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338941
Auto-Submit: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
2023-11-29 20:07:37 +00:00
Ryan Macnak 4bb3b97996 [vm] Avoid UBSAN warning near memmove.
TEST=ubsan
Bug: https://github.com/dart-lang/sdk/issues/54170
Change-Id: I04baffc9f947834e172394e77d803eb17ce93a7a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338644
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-11-29 17:01:49 +00:00
Vyacheslav Egorov 08d7e0aab2 [vm] Disable waitFor for 3.3 release
Revert "[vm] Enable waitFor for 3.2 release"

This reverts commit f8086ed78c.

R=kustermann@google.com
TEST=covered by existing tests

Bug: https://github.com/dart-lang/sdk/issues/52121
Change-Id: Ic5c7ad9af8ff142564ce237f868dd39354dfd615
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338761
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
2023-11-29 09:29:11 +00:00
Vyacheslav Egorov 6249b7ed34 [vm/compiler] Clean up typed data stores
Implementation of stores and their inlinings had some
stuff left over their since Dart 1:

* No need to insert null-checks (in sound null-safety mode).
* Since Dart 2 there is no need to insert (speculative)
cid checks. Inputs are guaranteed to be a value of a
supported implementation type. Inserting narrow speculative
checks for Smis is actually leads to worse code in JIT.
* There is no need to convert incomming integer values to
smaller representation - the store will take care of it. This was
left over from Dart 1 times when incomming integer could be _Bigint.

TEST=existing tests

Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-arm64-try,vm-aot-linux-release-x64-try,vm-aot-mac-product-arm64-try,vm-aot-linux-product-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-simriscv64-try,vm-aot-android-release-arm_x64-try,vm-aot-android-release-arm64c-try
Change-Id: I72cdaaecc524f1dccc63825df4f7b71241ab47a0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338600
Commit-Queue: Slava Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2023-11-29 09:26:14 +00:00
Ryan Macnak 739d987c91 [vm, compiler] Add MSAN support for ARM64.
TEST=local
Bug: https://github.com/dart-lang/sdk/issues/52399
Change-Id: I6af1954c70208534e87b6b87dd5cf62aaf595bd3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329582
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2023-11-28 23:52:49 +00:00
Ryan Macnak f59650497a [vm] Don't hold a group's isolates_lock_ while attempting to enter the group as a helper thread.
Avoids a three-way deadlock:
  existing isolate waiting for new isolate to reach reload safepoint
  new isolate waiting for sample processor to release isolates_lock_
  sample processor waiting for existing isolate to finish safepoint

TEST=reload bots
Bug: https://github.com/dart-lang/sdk/issues/54104
Change-Id: If4343293b94103d940d6a2f91904a14c6cb375b4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/337401
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-11-28 22:02:31 +00:00
Vyacheslav Egorov dcac60b672 [vm/aot] Fix BoxInt64 in deferred units
When generating code for deferred units compiler
can't emit PC relative call to the shared Mint allocation
stub. This causes compiler to emit an indirect call
through a Code object. Such calls clobber CODE_REG
which is actually an allocatable register.

Fix this by using non-allocatable register instead of
CODE_REG when generating indirect calls through
Code object in AOT mode. Callees don't expect
anything useful in CODE_REG anyway because AOT
calling convetion does not use it.

TEST=vm/cc/{BranchLinkPreservesRegisters,JumpAndLinkPreservesRegisters,CallCodePreservesRegisters}

Bug: b/242559057
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-arm64-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-x64-try,vm-aot-linux-product-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-linux-debug-simriscv64-try,vm-ffi-qemu-linux-release-riscv64-try
Change-Id: Ib1fdc1c104d0269d41bb1ab9cbe292ad28c7cd49
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338127
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
2023-11-28 13:15:56 +00:00
Derek Xu 6364fa6c77 [VM/Debugger] Delete best_token_pos
The value of best_token_pos was
exact_token_pos.Pos() - (requested_column - *best_column), but this
value is guaranteed to be the same as best_fit_pos.

TEST=CI

Change-Id: I96f21cc45ebbac94dfe35fa39af922a227e1fde6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338080
Commit-Queue: Derek Xu <derekx@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2023-11-27 19:43:59 +00:00
Derek Xu 65165dace6 [VM/Debugger] Fix vm-ffi-qemu-linux-release-riscv64 build
Fixes "error: suggest parentheses around ‘&&’ within ‘||’
[-Werror=parentheses]"

TEST=CI

Change-Id: I388bf5d62bba17dc782d39c9ba90727a9a176677
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338460
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Derek Xu <derekx@google.com>
2023-11-27 19:17:38 +00:00
Derek Xu ec30968b54 [VM/Debugger] Fix behaviour of setting breakpoints
My older CL that aimed to fix inline breakpoints was not quite correct.
It introduced some desirable behaviour, but also some undesirable
behaviour like https://github.com/dart-lang/sdk/issues/54100. This CL
reverts most of the changes in
https://dart-review.googlesource.com/c/sdk/+/316440 and then builds on
top of that.

TEST=pkg/vm_service/test/column_breakpoint_test.dart,
pkg/vm_service/test/column_breakpoint_test.dart, other debugger tests

Fixes: https://github.com/dart-lang/sdk/issues/54100
Change-Id: I2f5fdd55070aea9412a0b37e83c930cd24382adf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338040
Commit-Queue: Derek Xu <derekx@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2023-11-27 18:20:18 +00:00
Vyacheslav Egorov 48f29b15c7 [vm/aot] Make regexp/stack-overflow test pass
This test needs a larger backtracking stack then we provide
by default in AOT mode. Allow controlling stack size via
a command line flag regexp_backtrack_stack_size_kb.

Additionally cleanup types in the interpreter a bit: generated
code uses Int32List for both register and backtracking stack.
But the interpreter was using intptr_t for backtracking stack
and int32_t for registers. Align these types to use int32_t
everywhere and add a bit of sanity checking to ensure that
we don't try to use regexp engine with strings which are
too big to fit into int32_t range.

TEST=corelib/regexp/stack-overflow

Change-Id: I5c13c4b47d5d478b683f0450d3c0ce65f6961cff
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/338141
Commit-Queue: Slava Egorov <vegorov@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2023-11-27 15:22:40 +00:00
Daco Harkes 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>
2023-11-22 16:13:42 +00:00
Ryan Macnak fc85488000 [vm] Unwind records for Windows ARM64.
TEST=ffi_induce_a_crash_test
Bug: https://github.com/dart-lang/sdk/issues/51726
Change-Id: I7df3b56a150434d4c7b0cfbadda4fd9d57606eef
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336203
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-11-21 20:39:29 +00:00
Paul Berry a19ae4ee68 Enable the extension types language feature.
This language feature allows the user to declare a static type using
`extension type` syntax, for example:

    extension type IdNumber(int i) {
      operator <(IdNumber other) => i < other.i;
      bool isValid(Some parameters) => ...;
    }

This behaves similarly to a "wrapper" class:

    class IdNumber {
      final int i;
      IdNumber(this.i);
      operator <(IdNumber other) => i < other.i;
      bool isValid(Some parameters) => ...;
    }

However, at runtime, no wrapper objects are created; instead, an
instance of the extension type is represented directly by its
"representation type" (`int` in the above example), and methods like
`isValid` are resolved statically. This gives developers an
abstraction mechanism with the advantage of zero runtime performance
cost, since no extra heap space is required, and no extra instructions
are needed to convert between an extension type and its underlying
representation.

The disadvantage of using extension types as an abstraction mechanism
is that since no wrapper objects are created at runtime, the
abstraction can be bypassed using `dynamic`, runtime casts, or by
"laundering" the object through contravariant generic methods like
`List.add` (which are runtime checked in Dart). For example:

    main() {
      var id = IdNumber(1);
      var list1 = <int>[];
      List<Object> list2 = list1;
      list2.add(id); // OK at compile time because `IdNumber` is a
                     // subtype of `Object`. OK at runtime because
		     // at runtime, `IdNumber` and `int` are
		     // indistinguishable.
      int i = list1[0];
      print(i);
    }

Extension types are expected to be particularly useful for
low-overhead decoding of external data formats (such as JSON), and for
inter-operation with other languages (such as Javascript).

For additional information see the feature specification:
https://github.com/dart-lang/language/blob/main/accepted/future-releases/extension-types/feature-specification.md

Change-Id: I900a3a25dcfc38bfa9c9f9b5b9fa20f362883653
Tested: Standard trybots
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/335062
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2023-11-21 19:14:49 +00:00
Tess Strickland fc613d85a7 [vm] Respect PC offset printing options for disassembled function info.
When disassembling functions, respect whether absolute addresses should
be used for PC offsets when printing stack map, PC descriptor and
exception handler information.

Also don't print out results for empty auxiliary information.

TEST=ci

Change-Id: Ieda990c1eabcce8be968981a81123a78746c6b6b
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336663
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2023-11-21 12:23:52 +00:00
Martin Kustermann 742715e57a [gardening] Fix memory leak in vm/cc/SafepointRwLockExclusiveNestedWriter_Regress44000
The test was recently modified in [0] and introduced a memory leak which
this CL fixes.

TEST=Fixes vm/cc/SafepointRwLockExclusiveNestedWriter_Regress44000 in asan mode

[0] https://dart-review.googlesource.com/c/sdk/+/335580

Change-Id: I536b3c56cf448019294053e5ef7d347ccbe6d366
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/337482
Reviewed-by: Tess Strickland <sstrickl@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
2023-11-21 11:46:24 +00:00
Tess Strickland 26911a6176 [vm/compiler] On 32-bit archs, no specific inline for index checks.
Replacing index checks with a single GenericCheckBound instruction
currently causes performance regressions on 32-bit ARM. Undo that
optimization there for now, instead inlining the original Dart code
into the indexing operations.

TEST=ci

Issue: https://github.com/flutter/flutter/issues/138689
Change-Id: I7e67966b576a9d1b5f510e17b44f853f23c98a91
Cq-Include-Trybots: luci.dart.try:vm-linux-release-simarm-try,vm-ffi-qemu-linux-release-arm-try,vm-aot-linux-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/337480
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2023-11-21 11:40:01 +00:00
Daco Harkes df4ef72c01 [vm/ffi] Remove deprecated FfiNative
TEST=pkg/analyzer/test/
TEST=CI build with class removed from `dart:ffi`

Closes: https://github.com/dart-lang/sdk/issues/53923
CoreLibraryReviewExempt: VM & dart2wasm only.
Change-Id: I45a39b623754f9f1b65cac55ea9adae390199f5d
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm64c-try,analyzer-analysis-server-linux-try,analyzer-mac-release-try,dart-sdk-linux-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336960
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2023-11-20 13:16:28 +00:00
Alexander Aprelev 02c1493288 [io/win] Ensure isDST is correctly determined for pre-1970 dates on Windows.
Bug: https://github.com/dart-lang/sdk/issues/44656
Change-Id: Icf4925986430a1a6d149f362679bc68d01ea8746
TEST=ci
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336803
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
2023-11-17 19:11:57 +00:00
Ryan Macnak 8598086c7f [vm] Don't include the header when checking if PcDescriptors, etc are equal.
The header includes the mark bit, which may change if concurrent mark or sweep runs during deduping.

TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/49649
Change-Id: I9b99e42009aba06c9c5b5730dbe96d1c02550f5a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336623
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2023-11-17 18:07:13 +00:00