Cherry-pick "[vm, gc] Account for AllocateArray or CloneContext returning objects that have already been added to the remembered set."
Change-Id: I3eb26504c85f1d881837748e990d72183690ae7f
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 490f4c1..11ad1e8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -56,7 +56,7 @@
}
// [R0] already contains first argument.
__ mov(R1, Operand(THR));
- __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+ __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
if (preserve_registers) {
__ LeaveCallRuntimeFrame();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index a477f9e..5fdff33 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -54,7 +54,7 @@
}
// [R0] already contains first argument.
__ mov(R1, THR);
- __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+ __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
if (preserve_registers) {
__ LeaveCallRuntimeFrame();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 328a17a..17f6dab 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -54,7 +54,7 @@
}
__ movl(Address(ESP, 1 * target::kWordSize), THR);
__ movl(Address(ESP, 0 * target::kWordSize), EAX);
- __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+ __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
if (preserve_registers) {
__ LeaveCallRuntimeFrame();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 8bcf076..26f2e51 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -56,7 +56,7 @@
}
__ movq(CallingConventions::kArg1Reg, RAX);
__ movq(CallingConventions::kArg2Reg, THR);
- __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+ __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
if (preserve_registers) {
__ LeaveCallRuntimeFrame();
}
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 1a097cc..23b442c 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -320,13 +320,13 @@
}
DEFINE_LEAF_RUNTIME_ENTRY(RawObject*,
- AddAllocatedObjectToRememberedSet,
+ EnsureRememberedAndMarkingDeferred,
2,
RawObject* object,
Thread* thread) {
- // The allocation stubs in will call this leaf method for newly allocated
+ // The allocation stubs will call this leaf method for newly allocated
// old space objects.
- RELEASE_ASSERT(object->IsOldObject() && !object->IsRemembered());
+ RELEASE_ASSERT(object->IsOldObject());
// If we eliminate a generational write barriers on allocations of an object
// we need to ensure it's either a new-space object or it has been added to
@@ -338,7 +338,13 @@
// outermost runtime code (to which the genenerated Dart code might not return
// in a long time).
bool add_to_remembered_set = true;
- if (object->IsArray()) {
+ if (object->IsRemembered()) {
+ // Objects must not be added to the remembered set twice because the
+ // scavenger's visitor is not idempotent.
+ // Might already be remembered because of type argument store in
+ // AllocateArray or any field in CloneContext.
+ add_to_remembered_set = false;
+ } else if (object->IsArray()) {
const intptr_t length =
Array::LengthOf(reinterpret_cast<RawArray*>(object));
add_to_remembered_set =
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index cd9c4d6..204f78f 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -67,7 +67,7 @@
V(void, StoreBufferBlockProcess, Thread*) \
V(void, MarkingStackBlockProcess, Thread*) \
V(void, RememberCard, RawObject*, RawObject**) \
- V(RawObject*, AddAllocatedObjectToRememberedSet, RawObject* object, \
+ V(RawObject*, EnsureRememberedAndMarkingDeferred, RawObject* object, \
Thread* thread) \
V(double, LibcPow, double, double) \
V(double, DartModulo, double, double) \