Skip to content

Commit 6bc417d

Browse files
rmacnak-googleCommit Queue
authored and
Commit Queue
committed
[vm, compiler] Fix passing untagged pointer to store barrier check on ARM/ARM64.
Add missing store barrier check for RISCV. TEST=ci Bug: #55754 Change-Id: I90156c5fbb9f49b26ef19319dde7899b512670d7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366894 Reviewed-by: Alexander Aprelev <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 9c20217 commit 6bc417d

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

runtime/vm/compiler/stub_code_compiler_arm.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,9 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
18251825
__ Bind(&done);
18261826
} // kFieldReg = R1, kNullReg = R9
18271827

1828+
__ AddImmediate(AllocateObjectABI::kResultReg,
1829+
AllocateObjectABI::kResultReg, kHeapObjectTag);
1830+
18281831
// Store parameterized type.
18291832
if (is_cls_parameterized) {
18301833
Label not_parameterized_case;
@@ -1843,18 +1846,15 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
18431846
host_type_arguments_field_offset_in_words_offset()));
18441847

18451848
// Set the type arguments in the new object.
1846-
__ StoreIntoObjectNoBarrier(
1847-
AllocateObjectABI::kResultReg,
1848-
Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, LSL,
1849-
target::kWordSizeLog2),
1850-
AllocateObjectABI::kTypeArgumentsReg);
1849+
__ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
1850+
Operand(kTypeOffsetReg, LSL, target::kWordSizeLog2));
1851+
__ StoreIntoObjectNoBarrier(AllocateObjectABI::kResultReg,
1852+
FieldAddress(kTypeOffsetReg, 0),
1853+
AllocateObjectABI::kTypeArgumentsReg);
18511854

18521855
__ Bind(&not_parameterized_case);
18531856
} // kClsIdReg = R1, kTypeOffsetReg = R9
18541857

1855-
__ AddImmediate(AllocateObjectABI::kResultReg,
1856-
AllocateObjectABI::kResultReg, kHeapObjectTag);
1857-
18581858
__ Ret();
18591859

18601860
__ Bind(&slow_case);

runtime/vm/compiler/stub_code_compiler_arm64.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,6 +2146,9 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
21462146
__ WriteAllocationCanary(kNewTopReg); // Fix overshoot.
21472147
} // kFieldReg = R4
21482148

2149+
__ AddImmediate(AllocateObjectABI::kResultReg,
2150+
AllocateObjectABI::kResultReg, kHeapObjectTag);
2151+
21492152
if (is_cls_parameterized) {
21502153
Label not_parameterized_case;
21512154

@@ -2164,18 +2167,15 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
21642167
kFourBytes);
21652168

21662169
// Set the type arguments in the new object.
2170+
__ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
2171+
Operand(kTypeOffsetReg, LSL, target::kCompressedWordSizeLog2));
21672172
__ StoreCompressedIntoObjectNoBarrier(
2168-
AllocateObjectABI::kResultReg,
2169-
Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, UXTX,
2170-
Address::Scaled),
2173+
AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
21712174
AllocateObjectABI::kTypeArgumentsReg);
21722175

21732176
__ Bind(&not_parameterized_case);
21742177
} // kClsIdReg = R4, kTypeOffsetReg = R5
21752178

2176-
__ AddImmediate(AllocateObjectABI::kResultReg,
2177-
AllocateObjectABI::kResultReg, kHeapObjectTag);
2178-
21792179
__ ret();
21802180

21812181
__ Bind(&slow_case);

runtime/vm/compiler/stub_code_compiler_riscv.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,9 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
19271927
__ WriteAllocationCanary(kNewTopReg); // Fix overshoot.
19281928
} // kFieldReg = T4
19291929

1930+
__ AddImmediate(AllocateObjectABI::kResultReg,
1931+
AllocateObjectABI::kResultReg, kHeapObjectTag);
1932+
19301933
if (is_cls_parameterized) {
19311934
Label not_parameterized_case;
19321935

@@ -1944,16 +1947,15 @@ static void GenerateAllocateObjectHelper(Assembler* assembler,
19441947
host_type_arguments_field_offset_in_words_offset()));
19451948

19461949
// Set the type arguments in the new object.
1947-
__ slli(kTypeOffsetReg, kTypeOffsetReg, target::kWordSizeLog2);
1948-
__ add(kTypeOffsetReg, kTypeOffsetReg, AllocateObjectABI::kResultReg);
1949-
__ sx(AllocateObjectABI::kTypeArgumentsReg, Address(kTypeOffsetReg, 0));
1950+
__ AddShifted(kTypeOffsetReg, AllocateObjectABI::kResultReg,
1951+
kTypeOffsetReg, target::kWordSizeLog2);
1952+
__ StoreCompressedIntoObjectNoBarrier(
1953+
AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
1954+
AllocateObjectABI::kTypeArgumentsReg);
19501955

19511956
__ Bind(&not_parameterized_case);
19521957
} // kClsIdReg = R4, kTypeOffsetReg = R5
19531958

1954-
__ AddImmediate(AllocateObjectABI::kResultReg,
1955-
AllocateObjectABI::kResultReg, kHeapObjectTag);
1956-
19571959
__ ret();
19581960

19591961
__ Bind(&slow_case);

0 commit comments

Comments
 (0)