1504dc6362
In release builds most `Field` objects are tree shaken,
but if an instance field is e.g. a `late final` field then the `Field`
object is retained in the snapshot for the `LateInitializationError`
slow path. Though `Field` will not appear in `Class.fields()`, it
will only be referenced in the `ObjectPool`.
=> Instead of dumping `Class.fields()` we collect all `Field`s with
the same owner and dump those (a superset of `Class.fields()`)
We dump more information for a `Field`: Whether it's a reference field
or unboxed field (in which case we dump what unboxed type it is). We
also dump field flags (e.g. `late`, `final`, `static`).
We also dump now a `instance_slots` property on the class which
describes every slot in the instance. If a slot in an instance
* has a corresponding `Field` we emit `instance_field` type and
the id of the `Field` object.
* has no corresponding `Field` we emit a `unknown_slot` type
* we emit whether the slot is a reference field
This brings the information the `analyze_snapshot` tool dumps closer to
what Blutter uses, but some differences remain, e.g.:
* Blutter seems to scan constant instances of classes (if there's any)
and tries to determine based on those constants what unboxed slots
could mean.
It may look at 8 bytes and "guess" whether it's more likely to be an
integer or a double. (Side note: It doesn't consider
`Float32x4`/`Float64x2`)
=> The guess can be incorrect, so we do not do that.
* Blutter seems to scan constant instances of classes (if there's any)
and tries to guess the type of a reference field based on what that
constant's field points to.
=> The guess can be incorrect, so we do not do that.
go/dart-ama
TEST=vm/dart/analyze_snapshot_binary_test
Change-Id: I116560ba5e5f89d4349f2227362b8494e3af7a1c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/425261
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>