diff --git a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart index a6421227d67..ad49f6f2676 100644 --- a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart +++ b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart @@ -16,6 +16,7 @@ import 'use_flag_test_helper.dart'; const int headerSize = 8; final int compressedWordSize = sizeOf() == 8 && !Platform.executable.contains('64C') ? 8 : 4; +const int wordSize = 8; // analyze_snapshot is not supported on arm32 // Used to ensure we don't have multiple equivalent calls to test. final _seenDescriptions = {}; @@ -222,7 +223,8 @@ Future testAOT( // We have: // class Base { - // static int baseS = int.parse('1'); + // static int baseS0 = int.parse('1'); + // static int baseS1 = int.parse('2'); // int base0; // double base1; // Object? base2; @@ -231,10 +233,17 @@ Future testAOT( // } // // This static field is never tree shaken. - expectField(baseFields[0], name: 'baseS', flags: ['static']); + expectField(baseFields[0], name: 'baseS0', flags: ['static']); + expectField(baseFields[1], name: 'baseS1', flags: ['static']); + + // Neighboring static fields should always be one word away + final int staticFieldOffset0 = baseFields[0]["static_field_offset"]; + final int staticFieldOffset1 = baseFields[1]["static_field_offset"]; + Expect.equals(staticFieldOffset1 - staticFieldOffset0, wordSize); + if (isProduct) { // Most [Field] objests are tree shaken. - Expect.equals(1, baseFields.length); + Expect.equals(2, baseFields.length); int slotOffset = 0; slotOffset += expectUnknown8Bytes( @@ -264,28 +273,28 @@ Future testAOT( ); } else { // We don't tree shake [Field] objects in non-product builds. - Expect.equals(6, baseFields.length); + Expect.equals(7, baseFields.length); expectField( - baseFields[1], + baseFields[2], name: 'base0', isReference: false, unboxedType: 'int', ); expectField( - baseFields[2], + baseFields[3], name: 'base1', isReference: false, unboxedType: 'double', ); - expectField(baseFields[3], name: 'base2'); + expectField(baseFields[4], name: 'base2'); expectField( - baseFields[4], + baseFields[5], name: 'base3', isReference: false, unboxedType: 'Float32x4', ); expectField( - baseFields[5], + baseFields[6], name: 'base4', isReference: false, unboxedType: 'Float64x2', @@ -296,34 +305,34 @@ Future testAOT( offsetReferences: 0, offsetBytes: 0, isReference: false, - fieldId: baseFieldIds[1], + fieldId: baseFieldIds[2], ); slotOffset += expectInstanceSlot( baseSlots[slotOffset], offsetReferences: 0, offsetBytes: 8, isReference: false, - fieldId: baseFieldIds[2], + fieldId: baseFieldIds[3], ); slotOffset += expectInstanceSlot( baseSlots[slotOffset], offsetReferences: 0, offsetBytes: 16, - fieldId: baseFieldIds[3], + fieldId: baseFieldIds[4], ); slotOffset += expectInstanceSlot( baseSlots[slotOffset], offsetReferences: 1, offsetBytes: 16, isReference: false, - fieldId: baseFieldIds[4], + fieldId: baseFieldIds[5], ); slotOffset += expectInstanceSlot( baseSlots[slotOffset], offsetReferences: 1, offsetBytes: 32, isReference: false, - fieldId: baseFieldIds[5], + fieldId: baseFieldIds[6], ); } // We have: diff --git a/runtime/tests/vm/dart/analyze_snapshot_program.dart b/runtime/tests/vm/dart/analyze_snapshot_program.dart index d58ed4d5079..d9703252308 100644 --- a/runtime/tests/vm/dart/analyze_snapshot_program.dart +++ b/runtime/tests/vm/dart/analyze_snapshot_program.dart @@ -40,7 +40,8 @@ main() { } class FieldTestBase { - static int baseS = int.parse('1'); + static int baseS0 = int.parse('1'); + static int baseS1 = int.parse('2'); int base0; double base1; Object? base2; @@ -48,10 +49,12 @@ class FieldTestBase { Float64x2 base4; FieldTestBase(this.base0, this.base1, this.base2, this.base3, this.base4) { - baseS++; + baseS0++; + baseS1++; } - String foo() => 'Base.foo: [$baseS, $base0, $base1, $base2, $base3, $base4]'; + String foo() => + 'Base.foo: [$baseS0, $baseS1, $base0, $base1, $base2, $base3, $base4]'; } class FieldTestSub extends FieldTestBase { diff --git a/runtime/vm/analyze_snapshot_api_impl.cc b/runtime/vm/analyze_snapshot_api_impl.cc index f6f268e11cf..9a60ea8d36e 100644 --- a/runtime/vm/analyze_snapshot_api_impl.cc +++ b/runtime/vm/analyze_snapshot_api_impl.cc @@ -293,6 +293,8 @@ void SnapshotAnalyzer::DumpField(const Field& field) { js_.PrintProperty64("type_class", GetObjectId(field.type())); if (field.is_static()) { js_.PrintProperty("instance", GetObjectId(field.StaticValue())); + js_.PrintProperty64("static_field_offset", + FieldTable::FieldOffsetFor(field.field_id())); } if (field.HasInitializerFunction()) { js_.PrintProperty("initializer_function",