PPC/S390: [heap] Clean-up keys of oldspace weakmaps during scavenge
Port 6604f1826d
Original Commit Message:
This CL adds handling for cleaning up weakmap (EphemeronHashTable)
keys during scavenge, even if the weakmap resides in oldspace.
Change-Id: Idf8b6115e57b1229864afefe6ffee85acb5e7547
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1538320
Reviewed-by: Milad Farazmand <miladfar@ca.ibm.com>
Reviewed-by: Junliang Yan <jyan@ca.ibm.com>
Commit-Queue: Milad Farazmand <miladfar@ca.ibm.com>
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#60446}
This commit is contained in:
parent
080fa87143
commit
dd07cbcfdf
@ -180,7 +180,9 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
|
||||
__ mflr(scratch0_);
|
||||
__ Push(scratch0_);
|
||||
}
|
||||
if (stub_mode_ == StubCallMode::kCallWasmRuntimeStub) {
|
||||
if (mode_ == RecordWriteMode::kValueIsEphemeronKey) {
|
||||
__ CallEphemeronKeyBarrier(object_, scratch1_, save_fp_mode);
|
||||
} else if (stub_mode_ == StubCallMode::kCallWasmRuntimeStub) {
|
||||
__ CallRecordWriteStub(object_, scratch1_, remembered_set_action,
|
||||
save_fp_mode, wasm::WasmCode::kWasmRecordWrite);
|
||||
} else {
|
||||
|
@ -217,7 +217,9 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
|
||||
// We need to save and restore r14 if the frame was elided.
|
||||
__ Push(r14);
|
||||
}
|
||||
if (stub_mode_ == StubCallMode::kCallWasmRuntimeStub) {
|
||||
if (mode_ == RecordWriteMode::kValueIsEphemeronKey) {
|
||||
__ CallEphemeronKeyBarrier(object_, scratch1_, save_fp_mode);
|
||||
} else if (stub_mode_ == StubCallMode::kCallWasmRuntimeStub) {
|
||||
__ CallRecordWriteStub(object_, scratch1_, remembered_set_action,
|
||||
save_fp_mode, wasm::WasmCode::kWasmRecordWrite);
|
||||
} else {
|
||||
|
@ -34,6 +34,18 @@ void RecordWriteDescriptor::InitializePlatformSpecific(
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
void EphemeronKeyBarrierDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {r3, r4, r5, r6, r7};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
arraysize(default_stub_registers));
|
||||
|
||||
CHECK_LE(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
|
||||
return r4;
|
||||
}
|
||||
|
@ -459,6 +459,32 @@ void TurboAssembler::RestoreRegisters(RegList registers) {
|
||||
MultiPop(regs);
|
||||
}
|
||||
|
||||
void TurboAssembler::CallEphemeronKeyBarrier(Register object, Register address,
|
||||
SaveFPRegsMode fp_mode) {
|
||||
EphemeronKeyBarrierDescriptor descriptor;
|
||||
RegList registers = descriptor.allocatable_registers();
|
||||
|
||||
SaveRegisters(registers);
|
||||
|
||||
Register object_parameter(
|
||||
descriptor.GetRegisterParameter(EphemeronKeyBarrierDescriptor::kObject));
|
||||
Register slot_parameter(descriptor.GetRegisterParameter(
|
||||
EphemeronKeyBarrierDescriptor::kSlotAddress));
|
||||
Register fp_mode_parameter(
|
||||
descriptor.GetRegisterParameter(EphemeronKeyBarrierDescriptor::kFPMode));
|
||||
|
||||
push(object);
|
||||
push(address);
|
||||
|
||||
pop(slot_parameter);
|
||||
pop(object_parameter);
|
||||
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(isolate()->builtins()->builtin_handle(Builtins::kEphemeronKeyBarrier),
|
||||
RelocInfo::CODE_TARGET);
|
||||
RestoreRegisters(registers);
|
||||
}
|
||||
|
||||
void TurboAssembler::CallRecordWriteStub(
|
||||
Register object, Register address,
|
||||
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode) {
|
||||
|
@ -272,6 +272,8 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
void CallRecordWriteStub(Register object, Register address,
|
||||
RememberedSetAction remembered_set_action,
|
||||
SaveFPRegsMode fp_mode, Address wasm_target);
|
||||
void CallEphemeronKeyBarrier(Register object, Register address,
|
||||
SaveFPRegsMode fp_mode);
|
||||
|
||||
void MultiPush(RegList regs, Register location = sp);
|
||||
void MultiPop(RegList regs, Register location = sp);
|
||||
|
@ -34,6 +34,18 @@ void RecordWriteDescriptor::InitializePlatformSpecific(
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
void EphemeronKeyBarrierDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
const Register default_stub_registers[] = {r2, r3, r4, r5, r6};
|
||||
|
||||
data->RestrictAllocatableRegisters(default_stub_registers,
|
||||
arraysize(default_stub_registers));
|
||||
|
||||
CHECK_LE(static_cast<size_t>(kParameterCount),
|
||||
arraysize(default_stub_registers));
|
||||
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
|
||||
}
|
||||
|
||||
const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
|
||||
return r3;
|
||||
}
|
||||
|
@ -478,6 +478,32 @@ void TurboAssembler::RestoreRegisters(RegList registers) {
|
||||
MultiPop(regs);
|
||||
}
|
||||
|
||||
void TurboAssembler::CallEphemeronKeyBarrier(Register object, Register address,
|
||||
SaveFPRegsMode fp_mode) {
|
||||
EphemeronKeyBarrierDescriptor descriptor;
|
||||
RegList registers = descriptor.allocatable_registers();
|
||||
|
||||
SaveRegisters(registers);
|
||||
|
||||
Register object_parameter(
|
||||
descriptor.GetRegisterParameter(EphemeronKeyBarrierDescriptor::kObject));
|
||||
Register slot_parameter(descriptor.GetRegisterParameter(
|
||||
EphemeronKeyBarrierDescriptor::kSlotAddress));
|
||||
Register fp_mode_parameter(
|
||||
descriptor.GetRegisterParameter(EphemeronKeyBarrierDescriptor::kFPMode));
|
||||
|
||||
Push(object);
|
||||
Push(address);
|
||||
|
||||
Pop(slot_parameter);
|
||||
Pop(object_parameter);
|
||||
|
||||
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
|
||||
Call(isolate()->builtins()->builtin_handle(Builtins::kEphemeronKeyBarrier),
|
||||
RelocInfo::CODE_TARGET);
|
||||
RestoreRegisters(registers);
|
||||
}
|
||||
|
||||
void TurboAssembler::CallRecordWriteStub(
|
||||
Register object, Register address,
|
||||
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode) {
|
||||
|
@ -203,6 +203,8 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
void CallRecordWriteStub(Register object, Register address,
|
||||
RememberedSetAction remembered_set_action,
|
||||
SaveFPRegsMode fp_mode, Address wasm_target);
|
||||
void CallEphemeronKeyBarrier(Register object, Register address,
|
||||
SaveFPRegsMode fp_mode);
|
||||
|
||||
void MultiPush(RegList regs, Register location = sp);
|
||||
void MultiPop(RegList regs, Register location = sp);
|
||||
|
Loading…
Reference in New Issue
Block a user