[vm, compiler] Fix passing untagged pointer to store barrier check on ARM/ARM64.
Add missing store barrier check for RISCV.
TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/55754
Change-Id: I90156c5fbb9f49b26ef19319dde7899b512670d7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366894
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index c47a3e0..a20c382 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1825,6 +1825,9 @@
__ Bind(&done);
} // kFieldReg = R1, kNullReg = R9
+ __ AddImmediate(AllocateObjectABI::kResultReg,
+ AllocateObjectABI::kResultReg, kHeapObjectTag);
+
// Store parameterized type.
if (is_cls_parameterized) {
Label not_parameterized_case;
@@ -1843,18 +1846,15 @@
host_type_arguments_field_offset_in_words_offset()));
// Set the type arguments in the new object.
- __ StoreIntoObjectNoBarrier(
- AllocateObjectABI::kResultReg,
- Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, LSL,
- target::kWordSizeLog2),
- AllocateObjectABI::kTypeArgumentsReg);
+ __ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+ Operand(kTypeOffsetReg, LSL, target::kWordSizeLog2));
+ __ StoreIntoObjectNoBarrier(AllocateObjectABI::kResultReg,
+ FieldAddress(kTypeOffsetReg, 0),
+ AllocateObjectABI::kTypeArgumentsReg);
__ Bind(¬_parameterized_case);
} // kClsIdReg = R1, kTypeOffsetReg = R9
- __ AddImmediate(AllocateObjectABI::kResultReg,
- AllocateObjectABI::kResultReg, kHeapObjectTag);
-
__ Ret();
__ Bind(&slow_case);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 7782e13..71190d6 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -2146,6 +2146,9 @@
__ WriteAllocationCanary(kNewTopReg); // Fix overshoot.
} // kFieldReg = R4
+ __ AddImmediate(AllocateObjectABI::kResultReg,
+ AllocateObjectABI::kResultReg, kHeapObjectTag);
+
if (is_cls_parameterized) {
Label not_parameterized_case;
@@ -2164,18 +2167,15 @@
kFourBytes);
// Set the type arguments in the new object.
+ __ add(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+ Operand(kTypeOffsetReg, LSL, target::kCompressedWordSizeLog2));
__ StoreCompressedIntoObjectNoBarrier(
- AllocateObjectABI::kResultReg,
- Address(AllocateObjectABI::kResultReg, kTypeOffsetReg, UXTX,
- Address::Scaled),
+ AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
AllocateObjectABI::kTypeArgumentsReg);
__ Bind(¬_parameterized_case);
} // kClsIdReg = R4, kTypeOffsetReg = R5
- __ AddImmediate(AllocateObjectABI::kResultReg,
- AllocateObjectABI::kResultReg, kHeapObjectTag);
-
__ ret();
__ Bind(&slow_case);
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index 8af980b..b4b5f62 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -1927,6 +1927,9 @@
__ WriteAllocationCanary(kNewTopReg); // Fix overshoot.
} // kFieldReg = T4
+ __ AddImmediate(AllocateObjectABI::kResultReg,
+ AllocateObjectABI::kResultReg, kHeapObjectTag);
+
if (is_cls_parameterized) {
Label not_parameterized_case;
@@ -1944,16 +1947,15 @@
host_type_arguments_field_offset_in_words_offset()));
// Set the type arguments in the new object.
- __ slli(kTypeOffsetReg, kTypeOffsetReg, target::kWordSizeLog2);
- __ add(kTypeOffsetReg, kTypeOffsetReg, AllocateObjectABI::kResultReg);
- __ sx(AllocateObjectABI::kTypeArgumentsReg, Address(kTypeOffsetReg, 0));
+ __ AddShifted(kTypeOffsetReg, AllocateObjectABI::kResultReg,
+ kTypeOffsetReg, target::kWordSizeLog2);
+ __ StoreCompressedIntoObjectNoBarrier(
+ AllocateObjectABI::kResultReg, FieldAddress(kTypeOffsetReg, 0),
+ AllocateObjectABI::kTypeArgumentsReg);
__ Bind(¬_parameterized_case);
} // kClsIdReg = R4, kTypeOffsetReg = R5
- __ AddImmediate(AllocateObjectABI::kResultReg,
- AllocateObjectABI::kResultReg, kHeapObjectTag);
-
__ ret();
__ Bind(&slow_case);