Commit Graph

13143 Commits

Author SHA1 Message Date
Tess Strickland fca36cae39 [vm] Merge ImageHeader into InstructionsSection.
Before, we only wrapped the Instructions payloads in an
InstructionsSection in precompiled snapshots with bare instructions mode
enabled. This CL changes that to always add an InstructionsSection
wrapper in precompiled snapshots, even when not in bare instructions
mode, and moves all the information from the old ImageHeader object into
the InstructionsSection object instead. Note that in non-bare mode, the
InstructionsSection has no payload, and the Instructions objects follow
the InstructionsSection object instead of being contained by it.

This CL also wraps all implementations of AssemblyImageWriter and
SnapshotTextObjectNamer methods in a single DART_PRECOMPILER ifdef
block, since we only generate assembly in precompiled mode.  This
removes the need for the smaller DART_PRECOMPILER ifdef blocks scattered
across the AssemblyImageWriter method implementations.

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-mac-release-simarm64-try,vm-kernel-mac-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-release-x64-try
Change-Id: I3676fb5c6675845463707acbbb4759a465cfa342
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165563
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-10-06 17:10:05 +00:00
Tess Strickland 72cfc5c638 [vm] Clean up handling of payload-containing objects.
This CL adds a new PAYLOAD_SIZEOF specification to
runtime_offsets_list.h which defines InstanceSize methods given an
method name to invoke to get the header size (i.e., the size of
the object portion before the payload).

It uses this new specification to create appropriate InstanceSize()
methods for objects written to read-only sections of snapshots,
instead of needing separate size calculations for SIMARM_X64.

It adds more methods to Instructions to avoid special casing for bare
instructions mode. It also removes the special casing for SIMARM_X64,
serializing all read-only objects in the same manner even when not
in a crossword situation.

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-mac-release-simarm64-try,vm-kernel-mac-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-precomp-win-release-x64-try
Change-Id: Ie3e4009f4bc03688998c32281e42fa22a255731d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165501
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2020-10-06 07:59:33 +00:00
Ryan Macnak 63206926fd [vm] Set exactly the correct set of base objects before writing a snapshot instead of leaving associations from all previously written snapshots.
For the main program snapshot, this has no effect. For secondary loading unit snapshots, this ensures they only reference their own objects or objects from parents and not objects from siblings that were written earlier.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: Ia7c5bec3b0c66564685ed2fd1b2bec52d2459024
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163460
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-10-05 21:28:52 +00:00
Ryan Macnak e078d4f00a [vm] Avoid allocations when reporting unhandled exceptions.
Bug: https://github.com/dart-lang/sdk/issues/43642
Bug: b/169880355
Change-Id: I260b9d47f2b65d3cb4a48b966557d139978947e2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165740
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-10-05 20:42:02 +00:00
Ryan Macnak 36e42f8c87 [vm, gc] Also merge remembered set when merging heaps.
Change-Id: I3c5e7edc807fd058ee228706b9e30774315ed142
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165940
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-10-05 17:56:12 +00:00
Ryan Macnak 35b1e92486 [vm] Remove bad assert triggered when fetching heap snapshots.
Change-Id: Ie53edb2bf545fab80120fc268460c5c523a4a9de
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165864
Auto-Submit: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
2020-10-05 15:11:33 +00:00
Tess Strickland 62e297ea34 [vm] Drop ambiguous ObjectPtr constructor.
When building SIMARM64 in DEBUG mode on Mac, I get the following
error:

../../runtime/vm/simulator_arm64.cc:541:50: error: ambiguous conversion for static_cast from 'uint64_t' (aka 'unsigned long long') to 'dart::ObjectPtr'
              const Object& obj = Object::Handle(static_cast<ObjectPtr>(value));
                                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../runtime/vm/tagged_pointer.h:184:22: note: candidate constructor
  explicit constexpr ObjectPtr(uword tagged) : tagged_pointer_(tagged) {}
                     ^
../../runtime/vm/tagged_pointer.h:185:22: note: candidate constructor
  explicit constexpr ObjectPtr(intptr_t tagged) : tagged_pointer_(tagged) {}

Since uword is defined to be uintptr_t, and there's an implicit
conversion between intptr_t and uintptr_t, drop the intptr_t version and
keep only the uword version (since we tend to use uword when a value is
an integral form of a pointer value in other places).

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-mac-release-simarm64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-ubsan-linux-release-x64-try,vm-kernel-precomp-msan-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try
Change-Id: Ibc1d8ccd8291dfb89390f6b05d8247b3dedad408
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/166021
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2020-10-05 11:54:59 +00:00
Johnni Winther 8b07d1902c [kernel] Remove DirectPropertyGet/DirectPropertySet/DirectMethodInvocation
These nodes are no longer used.

Change-Id: I40c8df7376f0c40a4122c22d934fb3c6f6fd520d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165902
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2020-10-03 19:15:41 +00:00
Aske Simon Christensen 68fd2a9d52 [vm/jit] Pessimize type assumption in LoadLocal of covariant parameter.
This avoids unsound optimizations that could arise from loading a
parameter before its type had been checked.

Affects only unoptimized code.

Fixes https://github.com/dart-lang/sdk/issues/43464

Some considerations for a cleaner fix are described in
https://github.com/dart-lang/sdk/issues/43654

Change-Id: I05872e46495313e82e9c516e5f283e1bc4612300
Cq-Do-Not-Cancel-Tryjobs: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164500
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-10-02 16:17:58 +00:00
Ryan Macnak 7d79d215db [vm] Use handles instead of array allocation when executing catch entry moves
Issue https://github.com/dart-lang/sdk/issues/43543

Change-Id: I61472be2507ce97721ab162a8c86f9662ec27f72
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164540
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-10-02 15:59:18 +00:00
Ben Konyi 45159b12e0 [ VM / Service ] Add isolateFlags property to Isolate JSON response
Flags that can be set in `Dart_IsolateFlags` are now surfaced via the
Isolate JSON object returned from the service protocol. Currently only
returns boolean flags.

Related: https://github.com/dart-lang/sdk/issues/43588
Change-Id: I54a30155778de8612105eb4a5f60f8a222a086b4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165403
Commit-Queue: Ben Konyi <bkonyi@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-10-01 19:18:30 +00:00
Ben Konyi 9c1adbd8c5 [ dart:io / package:vm_service ] Change parameter name for httpEnableTimelineLogging enable -> enabled
This is a backward compatible change that will continue to accept the
old parameter name.

Fixes https://github.com/dart-lang/sdk/issues/43628

Change-Id: I4e7a9d8d14921784e9d1c8693ae2252cf5f023e4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165623
Reviewed-by: Kenzie Schmoll <kenzieschmoll@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
2020-10-01 17:17:58 +00:00
Martin Kustermann 9c59897fc4 [vm/compiler] Use CompileType of Values instead of Definitions in TypedDataOptimizer
Sometimes our compiler loses type information on [Definition]s but
retains the more precise [CompileType] on the [Value]s, so use
the [Value]s [CompileType].

Issue https://github.com/dart-lang/sdk/issues/43534

Change-Id: Ibb3610f389ec55025655a8f0ac78a33a6269063d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165360
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
2020-10-01 11:36:32 +00:00
Martin Kustermann e34f6e4405 [vm/compiler] Ensure parameters for multiple entrypoints get Phi nodes with AssertAssignable/Redefinition as inputs
Our compiler uses data dependencies to represent certain control
dependencies. In particular code that uses a SSA definition after an
AssertAssignable should use the AssertAssignable instead of it's input.

Issue https://github.com/dart-lang/sdk/issues/43534

Change-Id: I495b793a68a99385483c62e3cbc6a7e12b2527ab
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165562
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
2020-10-01 11:24:22 +00:00
Clement Skau b4f49dc255 Revert "Flow analysis: promote to non-nullable on initialization"
This reverts commit 6a1c54ec30.

Reason for revert: Triggers test failure:
https://ci.chromium.org/p/dart/builders/ci.sandbox/vm-kernel-precomp-linux-debug-x64/8247

Original change's description:
> Flow analysis: promote to non-nullable on initialization
>
> When flow analysis encounters a variable declaration of the form `T? x
> = expr;`, if the type of `expr` is `T`, then the variable is
> immediately promoted to type `T`.
>
> Fixes #43099.
>
> Change-Id: Ia206fe0d50e2fdd9bdf637e13c85633d8490dbcc
> Bug: https://github.com/dart-lang/sdk/issues/43099
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163841
> Commit-Queue: Paul Berry <paulberry@google.com>
> Reviewed-by: Bob Nystrom <rnystrom@google.com>
> Reviewed-by: Johnni Winther <johnniwinther@google.com>
> Reviewed-by: Konstantin Shcheglov <scheglov@google.com>

TBR=paulberry@google.com,scheglov@google.com,rnystrom@google.com,johnniwinther@google.com

Change-Id: I8549b48a734f527194ce11d82235b9d5c6e58185
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: https://github.com/dart-lang/sdk/issues/43099
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165564
Reviewed-by: Clement Skau <cskau@google.com>
Commit-Queue: Clement Skau <cskau@google.com>
2020-10-01 08:41:15 +00:00
Paul Berry 6a1c54ec30 Flow analysis: promote to non-nullable on initialization
When flow analysis encounters a variable declaration of the form `T? x
= expr;`, if the type of `expr` is `T`, then the variable is
immediately promoted to type `T`.

Fixes #43099.

Change-Id: Ia206fe0d50e2fdd9bdf637e13c85633d8490dbcc
Bug: https://github.com/dart-lang/sdk/issues/43099
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163841
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2020-10-01 01:15:31 +00:00
Ryan Macnak f54c0a3b9b [vm] Prepare for canonicalizing general constants on load.
- Use null instead of empty array for the initial constants set, as fields dropped during snapshot are populated with null.
 - Remove assumption that canonicalization will always be bottom-up. Deserialization clusters will cause canonicalization to be ordered by class instead of by depth.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: Ia3ab68281c783299e682f6c60a744c320c19e981
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165160
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2020-09-30 22:29:05 +00:00
Clement Skau 379e208849 [Test] Fix lazy-async nested stepping consistency, tests.
The debugger async function handling has been moved to allow handling
of stepping_fp_ and async_stepping_fp_.
Previously the presence of an async function would take precedence over
the *stepping_fp while stepping, resulting in nested asyncs to
incorrectly re-trigger the insertion of synthetic breakpoints.

This fix revealed three tests that were still testing for unintentional
inconsistencies between causal and lazy async.
Note that there are still tests that branch on `useCausalAsyncStacks`
though these all test for known differences - namely that lazy async
cannot traverse unawaited future calls.

Cq-Include-Trybots: luci.dart.try:app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-x64-try
Change-Id: I5f74db18086a90828024dbb461759869531d478f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164781
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Clement Skau <cskau@google.com>
2020-09-28 08:18:07 +00:00
Lasse R.H. Nielsen 02923c6f83 Make Future.wait not return a const <Never>[] when given no futures.
Fixes #43445.

Bug: https://github.com/dart-lang/sdk/issues/43445
Change-Id: I70f722f6bee1d4cfe4d53a5f37bc29f0751edd78
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164162
Reviewed-by: Nate Bosch <nbosch@google.com>
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
2020-09-25 10:37:00 +00:00
Paul Berry def50905c2 Make flow analysis handling of is/==/??=/?. consistent with mixed mode semantics
Bug: https://github.com/dart-lang/language/issues/1143
Change-Id: Id177f8b19c15ef246f21ddd840410cddfee2e5cc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163600
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2020-09-25 08:35:03 +00:00
Ryan Macnak 39719118a4 [vm] Split canonical and non-canonical objects across clusters instead of within clusters.
Ensure canonical clusters come first; prep for canonical objects in snapshot accounting for the possibility an existing canonical object may substitute for them.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: I8083f4130c359f0f86f73c25fa2869af672700e6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164250
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-09-24 21:24:28 +00:00
Ryan Macnak c77eec3bab [vm] Remove assumption from Instance cluster than the Class cluster comes earlier.
Clusters should not read information produced by any other cluster until PostLoad.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: I39ec580d9011604f7041615cefaa907aa99a3ff8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164280
Reviewed-by: Régis Crelier <regis@google.com>
2020-09-24 21:24:28 +00:00
Tess Strickland a36d17730a Reland "[vm] Allow BaseWriteStream::WriteFixed to be used at unaligned positions."
Fixes errors introduced by adding PRINTF_ATTRIBUTE to
BaseWriteStream::Printf due to attempting to print a
compiler::target::uword using the format for uword.

Original description:

For snapshot writing, we generally only have aligned writes so the old
methods worked well, but in some formats (like DWARF) we're not
guaranteed to have aligned writes and so had to use WriteBytes.
Instead, have WriteFixed call WriteBytes and replace any other uses of
WriteBytes(&value, sizeof(value)) with WriteFixed(value) instead.

Also makes the following additional changes:

* Expose WriteByte(value), instead of forcing use of
  WriteFixed<uint8_t> or Raw<1,T>::Write to get the same behavior.

* Rename Print/VPrint to Printf/VPrintf, so methods taking format
  strings are named consistently with others in the codebase.

* Add format string checking to Printf when supported.

* Add AddString() for non-formatted string writing.

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-mac-release-simarm64-try,vm-kernel-mac-release-x64-try,vm-kernel-precomp-linux-release-simarm_x64-try
Change-Id: Ib70ccaa752dbf9ead5ea57e386a67725723bac84
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164324
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-09-24 16:58:30 +00:00
Tess Strickland 074d6e1309 Revert "[vm] Allow BaseWriteStream::WriteFixed to be used at unaligned positions."
This reverts commit 4e2556215a.

Reason for revert: Adding PRINTF_ATTRIBUTE broke more than expected on Mac bots.

Original change's description:
> [vm] Allow BaseWriteStream::WriteFixed to be used at unaligned positions.
>
> For snapshot writing, we generally only have aligned writes so the old
> methods worked well, but in some formats (like DWARF) we're not
> guaranteed to have aligned writes and so had to use WriteBytes.
> Instead, have WriteFixed call WriteBytes and replace any other uses of
> WriteBytes(&value, sizeof(value)) with WriteFixed(value) instead.
>
> Also makes the following additional changes:
>
> * Expose WriteByte(value), instead of forcing use of
>   WriteFixed<uint8_t> or Raw<1,T>::Write to get the same behavior.
>
> * Rename Print/VPrint to Printf/VPrintf, so methods taking format
>   strings are named consistently with others in the codebase.
>
> * Add format string checking to Printf when supported.
>
> * Add AddString() for non-formatted string writing.
>
> Change-Id: I5a2e91380bc41b0502e1a576acec786dfe66abbf
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164161
> Commit-Queue: Tess Strickland <sstrickl@google.com>
> Reviewed-by: Martin Kustermann <kustermann@google.com>

TBR=kustermann@google.com,rmacnak@google.com,sstrickl@google.com

Change-Id: Ie90ac4477f4c581692b37429536ce8dd66788540
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164323
Reviewed-by: Tess Strickland <sstrickl@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2020-09-24 13:57:52 +00:00
Tess Strickland 4e2556215a [vm] Allow BaseWriteStream::WriteFixed to be used at unaligned positions.
For snapshot writing, we generally only have aligned writes so the old
methods worked well, but in some formats (like DWARF) we're not
guaranteed to have aligned writes and so had to use WriteBytes.
Instead, have WriteFixed call WriteBytes and replace any other uses of
WriteBytes(&value, sizeof(value)) with WriteFixed(value) instead.

Also makes the following additional changes:

* Expose WriteByte(value), instead of forcing use of
  WriteFixed<uint8_t> or Raw<1,T>::Write to get the same behavior.

* Rename Print/VPrint to Printf/VPrintf, so methods taking format
  strings are named consistently with others in the codebase.

* Add format string checking to Printf when supported.

* Add AddString() for non-formatted string writing.

Change-Id: I5a2e91380bc41b0502e1a576acec786dfe66abbf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164161
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-09-24 12:45:00 +00:00
Daco Harkes a7fa63493f [cfe] Give external field generated setters parameter names
The setters generated from external fields used not have a name.
This broke the assumptions in the VM when making stack traces.

Separated out from https://dart-review.googlesource.com/c/sdk/+/140290.

Issue: https://github.com/dart-lang/sdk/issues/43533

Change-Id: I1816557eff891eaa7c531db1f4239159c66c325c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164093
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
2020-09-23 22:42:09 +00:00
Tess Strickland a4a714ebf9 [vm] Consolidate the *WriteStream hierarchy.
All *WriteStream classes are now part of the same hierarchy:

class BaseWriteStream : ValueObject;

  Base class for all *WriteStreams. Provides all the methods from
  the old WriteStream except for buffer() and SetPosition()
  (relegated to NonStreamingWriteStreams). Has one pure virtual
  method Realloc that must be overridden by concrete subclasses.

class NonStreamingWriteStream : BaseWriteStream;

  Base class for all *WriteStreams where the entire stream is available
  at all times (i.e., no flushing to an external sink). Extends the
  public BaseWriteStream API with buffer() (for accessing the stream
  contents) and SetPosition() (for changing the current stream pointer
  to the given absolute position in the stream).

class MallocWriteStream : NonStreamingWriteStream;

  Uses realloc to reallocate the internal buffer.  Almost the same as
  the old WriteStream, except that it only takes an initial size.  Adds
  one public method Steal() for taking ownership of the current buffer
  contents (after which the buffer is reset to an empty state). Instead
  of passing a pointer to a buffer, the internal buffer must be accessed
  via either Steal() or buffer(), which allows access to the current
  stream contents without changing ownership or resetting the stream.
  The internal buffer is freed on stream destruction.

class ZoneWriteStream: NonStreamingWriteStream;

  Takes a zone and reallocates the internal buffer in that zone. No
  additional public methods beyond those available from
  NonStreamingWriteStream.

class StreamingWriteStream : BaseWriteStream;

  Uses realloc to reallocate the internal buffer.  Generally same as
  before, where the contents of the stream are periodically flushed
  using Dart_StreamingWriteCallback. Since it extends BaseWriteStream,
  there are now more methods available for writing data to the stream
  than just Print/VPrint/WriteBytes. Since portions of the stream may be
  flushed and thus no longer in the internal buffer, does not provide
  access to the contents of the stream or a way to reposition the
  current stream pointer. Flushes any unflushed data and frees the
  internal buffer on stream destruction.

Also refactor things so that write streams are passed to appropriate
recipients, instead of the recipients taking arguments they only used to
create a WriteStream internally. Thus, recipients now can just specify
the appropriate base class for the public API used:

* BaseWriteStream for just writing to the stream, or
* NonStreamingWriteStream if re-positioning or the stream contents are
  needed.

Change-Id: I419096ecd9331483d168b079fca55b69ef397f15
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164080
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-09-23 21:05:59 +00:00
Ryan Macnak a4637cd81d [vm] Build canonical string and type tables after reading snapshots.
Prevents snapshots from including canonical strings and types with no real uses and only referenced from the canonical tables.

Prep for constants not all being in the root snapshot during snapshot splitting, which is why we fill the table during load instead of rebuilding tables during snapshot writing.

Removes the size of the tables from the snapshot.
flutter_gallery_app_so_size (Pixel 2)        -1.618% 7967664 8098736
flutter_gallery_app_so_gzip_size (Pixel 2)   -2.724% 2980344 3063788
flutter_gallery_app_so_brotli_size (Pixel 2) -3.530% 2561824 2655566

Bug: https://github.com/dart-lang/sdk/issues/41974
Bug: https://github.com/dart-lang/sdk/issues/43319
Change-Id: I4f3b62da1cea9ee17caa965e809f16856518c9a6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164102
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-09-23 19:13:29 +00:00
Tess Strickland 1d603120c5 [vm] Add std:: prefix to nullptr_t.
Change-Id: Idb111beef3a4f14ba6aaac6c9e894e92526d822b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164140
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2020-09-23 17:05:09 +00:00
Tess Strickland d5649fc9f6 [vm] Add build ID to non-symbolic stack traces.
Since we've run out of room for more fields in the Image object header
on 64-bit architectures, the serializer instead creates an ImageHeader
object for precompiled snapshots that is placed at the start of text
segments. The new ImageHeader object contains the following information:

* The offset of the BSS segment from the text segment, previously
  stored in the Image object header.

* The relocated address of the text segment in the dynamic shared
  object. Due to restrictions when generating assembly snapshots, this
  field is only set for ELF snapshots, and so it can also be used to
  detect whether a snapshot was compiled to assembly or ELF.

* The offset of the build ID description field from the text segment.

* The length of the build ID description field.

We replace the BSS offset in the Image object header with the offset of
the ImageHeader object within the text segment, so that we can detect
when a given Image has an ImageHeader object available.

There are no methods available on ImageHeader objects, but instead the
Image itself controls access to the information. In particular, the
relocated address method either returns the relocated address
information from the ImageHeader object or from the initialized BSS
depending on the type of snapshot, so the caller need not do this work.
Also, instead of returning the raw offset to the BSS section and having
the caller turn that into an appropriate pointer, the method for
accessing the BSS segment now returns a pointer to the segment.

Bug: https://github.com/dart-lang/sdk/issues/43274
Cq-Include-Trybots: luci.dart.try:vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-precomp-android-release-arm_x64-try
Change-Id: I15eae4ad0a088260b127f3d07da79374215b7f56
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163207
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2020-09-22 17:14:44 +00:00
Ben Konyi e85e5b6264 [ dart:io / package:vm_service ] Add httpEnableTimelineLogging extension and service events
- Added httpEnableTimelineLogging to the dart:io service extensions
- Deprecated setHttpEnableTimelineLogging and getHttpEnableTimelineLogging
- Send service event when HTTP timeline logging state has changed

Change-Id: I56df249fcfb11d7041a40a7749d47f6ef8f97c10
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163724
Reviewed-by: Kenzie Schmoll <kenzieschmoll@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
2020-09-22 16:06:23 +00:00
Alexander Markov f59ffd910b [vm] Fix AllocateTypedData stub for ia32
Fixes bug in register usage in ia32 stub for typed data allocation.
The bug was introduced in https://dart-review.googlesource.com/c/sdk/+/161840
when asm intrinsics for typed data allocation were converted to stubs.
This change fixes performance regressions on ia32 caused by that bug.

Change-Id: I4f05e157a56a3bd561895ec435b1e1f80d0c3880
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163728
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-09-21 23:52:02 +00:00
Ryan Macnak 30897929fc [vm] Fix warnings in GCC 9.3.0 and XCode 12.0.
Bug: https://github.com/flutter/flutter/issues/66203
Change-Id: Ifff0c211e2ecdcb56d62c273a471fc05bbae9c37
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/161602
Reviewed-by: Chinmay Garde <chinmaygarde@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-09-21 22:02:32 +00:00
Alexander Markov aa936d4294 [vm/compiler] Fix crash in ConstantPropagator::VisitInstanceOf when value is sentinel/unreachable
Result of an inlined method call is represented with sentinel if method
does not return. This change adjusts ConstantPropagator::VisitInstanceOf
to handle sentinel value and avoid calling IsInstanceOf on it.

Fixes https://github.com/dart-lang/sdk/issues/42799

Change-Id: Ibf9e4a4b30474ae3813148d23c764518f8edeb8b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/155580
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-09-21 21:37:52 +00:00
Alexander Aprelev 8ce78ca107 [vm/msan] Fix msan error triggered when building debug gen_snapshot.
Fixes https://github.com/dart-lang/sdk/issues/43433.

Change-Id: Ia7558251ab7a6115c3e0092ad57011e7e1f42340
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163722
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
2020-09-21 19:42:42 +00:00
Ryan Macnak e7dc37c516 [vm, gc] Don't start or finalize concurrent marking during a force growth scope.
Adjust tests to exit force growth scopes before forcing a GC.

Change-Id: I6d84c83e75ab8da4e0d623256d1997efd61341d1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163140
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-09-18 21:32:56 +00:00
Ben Konyi a44409615f [ Service / dart:io ] Rework previously unused dart:io service extensions
This CL is mostly modernizing existing Process and File profiling code
that was never made public. Updated the service extension responses to
be more consistent with the rest of the service protocol.

Related to https://github.com/dart-lang/sdk/issues/41455.

Change-Id: I116b3cd1424980e4ec8133672901990776c1d9c7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/157160
Commit-Queue: Ben Konyi <bkonyi@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
2020-09-18 20:15:56 +00:00
Martin Kustermann eac07c1770 [vm] Fix incorrect of re-use of a handle in recursive context
The recursive call can assign the TypeArguments handle a new value. Once
the recursive call returns it's no longer safe to continue iterating
over the type arguments array.

Instead we make a custom handle.

Fixes https://github.com/dart-lang/sdk/issues/43412

Change-Id: Ifff652f3f3cece64fb8b39a328918ba46dc8d21b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162724
Reviewed-by: Tess Strickland <sstrickl@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
2020-09-18 12:01:11 +00:00
Clement Skau 639de610e8 [Compiler] Adds const fold for StringIterpolate.
Bug: https://github.com/dart-lang/sdk/issues/43229
Change-Id: Ied6b59fdc91d9148b6c54a4a6a15f89e6d7e5a41
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162500
Commit-Queue: Clement Skau <cskau@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2020-09-18 09:35:22 +00:00
Daco Harkes a80f9d7da8 [vm/ffi] Stop using R8 in FFI calls, callbacks and stubs on arm64
R8 is used for passing the address when returning structs by value
in the native ABI.

Separated out from https://dart-review.googlesource.com/c/sdk/+/140290

Issue: https://github.com/dart-lang/sdk/issues/36730

Change-Id: I35187d35b8cd1b9fe6852faf0cd02a5f51e9f358
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-linux-debug-ia32-try,vm-kernel-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163204
Reviewed-by: Tess Strickland <sstrickl@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
Auto-Submit: Daco Harkes <dacoharkes@google.com>
2020-09-17 21:08:13 +00:00
Alexander Aprelev 26e503612a [vm/sendport] Ensure that partially instantiated static closures keep types when sent over SendPort.
Fixes https://github.com/dart-lang/sdk/issues/43343.

Change-Id: If2a741ba9b13f7817ff765d83f3f5a920860cb9e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163133
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-09-17 19:17:53 +00:00
Ryan Macnak ac6095a7cc [vm] Hash strings by UTF16 code unit instead of by rune.
The VM hasn't had UTF32 strings for many years, and it is cheaper to hash by code unit. In particular, it is convenient for hashing two-byte strings while they are being deserialized.

Change-Id: Icad3b4e7a5292bd45b0ae4f12861cd1ed20bf9ff
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/160180
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-09-17 18:56:33 +00:00
Clement Skau 3a5c166647 [VM] Makes the GCEventCallback VM-wide.
Bug: https://github.com/dart-lang/sdk/issues/43106
Change-Id: I35ba6875deb5239a8e0154fe3cc20c321392bcbe
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162756
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Clement Skau <cskau@google.com>
2020-09-17 06:07:50 +00:00
Alexander Markov 13aaaae1b2 [vm/compiler] Introduce AllocateTypedData IL instruction
This is the first step towards optimizing typed data array allocations,
which is useful for e.g. package:vector_math.

Opaque call to a typed data factory constructor is replaced with IL
instruction which doesn't have side-effects and doesn't prevent
other optimizations (e.g. load forwarding) from happening.

Asm intrinsics for typed data factories are replaced with stubs.

Issue: https://github.com/dart-lang/sdk/issues/43228
Change-Id: Icc7d4863f2f94ea5d8bb4620d041f7b6fe664098
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/161840
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-09-16 03:16:42 +00:00
Ryan Macnak acbd51c08d [vm] Serialize strings compactly, instead of as heap images.
Avoids the space overhead for the class, hash and alignment padding.

Flutter Gallery ARM64 release
Total(CodeSize): 8537094 -> 8088430 (-5.25%)

Change-Id: I73bc984f157042824c29efc42d45547914bd3c1b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/160183
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
2020-09-15 18:36:41 +00:00
Alexander Aprelev 083ecee7f6 [vm/fieldtable] Fix retaining paths for static fields.
This is a follow-up to https://dart.googlesource.com/sdk/+/e2aadc7a075da3b52957c93dc39d3b7fc86a5d1b which regressed retaining path reporting for static field values.

Fixes https://github.com/dart-lang/sdk/issues/43025

Change-Id: Iee9f289652e41fafd075a9e93b225099aac8e01c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162900
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
2020-09-15 18:32:31 +00:00
Chris Bracken f8cbabeeae Add forward-declaration of Intrinsifier
This fixes the following compile warning on Windows:

    ../../third_party/dart/runtime\vm/compiler/asm_intrinsifier.h(37,16):
    warning: unqualified friend declaration referring to type outside of
    the nearest enclosing namespace is a Microsoft extension; add a
    nested name specifier [-Wmicrosoft-unqualified-friend]

    friend class Intrinsifier;
    ^
    ::dart::

Change-Id: I2b1f8b961a32e47c7ec6244616f68989356f55e2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162901
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
2020-09-15 17:33:41 +00:00
Dan Field b62fc7c43a Allow for named lookup when the caller knows the private key of the class but not the function
Change-Id: I5374b25140ada7af157f0f5fbcfb26141d5072d8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162460
Commit-Queue: Dan Field <dnfield@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-09-15 00:38:08 +00:00
Regis Crelier 27235bf480 [VM/runtime] Fix finalization of recursive types.
Super type's type arguments that are still unfinalized after instantiation during finalization are not necessarily `TypeRef`, but can be (recursive) `Type`.
Add regression test.

This fixes flutter issue https://github.com/flutter/flutter/issues/65278

Change-Id: I07f842d798d24ebff9d1462d7e47278e901c0128
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162583
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-09-14 18:52:43 +00:00
Tess Strickland 781094f2ce [vm/bytecode] Add parameter flags to FunctionDeclaration.
We create the parameter names array when loading the
FunctionDeclaration, but the required parameter flags are only set later
when we load the Code declaration. If there's an intermediate use of the
Function object that copies the required parameter flags, like creating
an ImplicitClosureFunction when loading a tearoff stored in the object
pool, there will be no set flags at that point.

Add a copy of the parameter flags to the FunctionDeclaration so the
required flags can be set at the same time as the parameter name and
type to avoid this scenario.

To avoid adding unneeded flags to the kernel bytecode, we only serialize
the parameter flags needed for each declaration, so FunctionDeclaration
and ClosureDeclaration only contain the required flag, and Code contains
all flags _but_ the required flag.

There are no trybots for strong mode + bytecode, but manually checked
by running the following on the main branch (cherry-picking the
test_matrix.json changes) and this branch:

python tools/test.py \
    -n dartkb-mixed-strong-linux-release-x64,dartkb-interpret-strong-linux-release-x64 \
    tests/language/nnbd/required_named_parameters/missing_required_argument_dynamic_test.dart

Cq-Include-Trybots: luci.dart.try:vm-dartkb-linux-release-simarm64-try,vm-dartkb-linux-release-x64-try
Change-Id: Ic75b831d5ceed08154e2c61b8f64461705558653
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/162501
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2020-09-14 15:28:20 +00:00