1827fcbf68
Previously, CanBeImmediateIndex calculated the scaling factor for the index using Instance::ElementSizeFor. However, the LoadIndexed and StoreIndexed instructions which use this function have an index_scale_ field that is not necessarily the same as the element size for the class id. This means the displacement calculated within CanBeImmediateIndex can differ from the actual displacement calculated within ElementAddressForIntIndex, causing the bug seen by the fuzzer. This CL moves the check in CanBeImmediateIndex to a new static method Assembler::AddressCanHoldConstantIndex. In addition to the original arguments to CanBeImmediateIndex, the new static method takes an index_scale argument, so the field value can be passed appropriately. It also adds an is_external argument on X64 and IA32 to match the other architectures, since assuming a non-external typed data object could cause a register to be used in cases where it isn't necessary. TEST=vm/dart/regress_54486 Fixes: https://github.com/dart-lang/sdk/issues/54486 Change-Id: Ia553fb7da0500113b35f8d9af91a52df55437a3c Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-x64-try,vm-linux-debug-ia32-try,vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-simriscv64-try,vm-aot-mac-release-arm64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/345002 Reviewed-by: Daco Harkes <dacoharkes@google.com>
Dart VM Compilation Pipeline
This folder contains Dart VM compilation pipeline.
Compilation pipeline is mainly responsible for converting AST or Kernel AST into IL flow graphs and then generating native code from IL.
It has the following structure:
| Directory | What goes there |
|---|---|
assembler/ |
Assemblers and disassemblers |
backend/ |
IL based compilation backend: optimization passes and architecture specific code generation rules |
frontend/ |
Frontends responsible for converting AST into IL |
jit/ |
JIT specific passes and compilation pipeline entry points |
aot/ |
AOT specific passes and compilation pipeline entry points |
. |
Shared code or code without clear designation. |
Currently there are no layering restrictions and components from different subfolders can reference each other.