mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 912264 - Reset OSI-regs flags before the implicit interrupt check. r=
This commit is contained in:
parent
498d8e53fa
commit
476005ce83
@ -881,6 +881,14 @@ class OutOfLineInterruptCheckImplicit : public OutOfLineCodeBase<CodeGenerator>
|
||||
bool
|
||||
CodeGenerator::visitOutOfLineInterruptCheckImplicit(OutOfLineInterruptCheckImplicit *ool)
|
||||
{
|
||||
#ifdef CHECK_OSIPOINT_REGISTERS
|
||||
// This is path is entered from the patched back-edge of the loop. This
|
||||
// means that the JitAtivation flags used for checking the validity of the
|
||||
// OSI points are not reseted by the path generated by generateBody, so we
|
||||
// have to reset it here.
|
||||
resetOsiPointRegs(ool->lir->safepoint());
|
||||
#endif
|
||||
|
||||
LInstructionIterator iter = ool->block->begin();
|
||||
for (; iter != ool->block->end(); iter++) {
|
||||
if (iter->isLabel()) {
|
||||
@ -2766,17 +2774,8 @@ CodeGenerator::generateBody()
|
||||
}
|
||||
|
||||
#ifdef CHECK_OSIPOINT_REGISTERS
|
||||
if (iter->safepoint() && shouldVerifyOsiPointRegs(iter->safepoint())) {
|
||||
// Set checkRegs to 0. If we perform a VM call, the instruction
|
||||
// will set it to 1.
|
||||
GeneralRegisterSet allRegs(GeneralRegisterSet::All());
|
||||
Register scratch = allRegs.takeAny();
|
||||
masm.push(scratch);
|
||||
masm.loadJitActivation(scratch);
|
||||
Address checkRegs(scratch, JitActivation::offsetOfCheckRegs());
|
||||
masm.store32(Imm32(0), checkRegs);
|
||||
masm.pop(scratch);
|
||||
}
|
||||
if (iter->safepoint())
|
||||
resetOsiPointRegs(iter->safepoint());
|
||||
#endif
|
||||
|
||||
if (!callTraceLIR(i, *iter))
|
||||
|
@ -591,6 +591,23 @@ CodeGeneratorShared::shouldVerifyOsiPointRegs(LSafepoint *safepoint)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
CodeGeneratorShared::resetOsiPointRegs(LSafepoint *safepoint)
|
||||
{
|
||||
if (!shouldVerifyOsiPointRegs(safepoint))
|
||||
return;
|
||||
|
||||
// Set checkRegs to 0. If we perform a VM call, the instruction
|
||||
// will set it to 1.
|
||||
GeneralRegisterSet allRegs(GeneralRegisterSet::All());
|
||||
Register scratch = allRegs.takeAny();
|
||||
masm.push(scratch);
|
||||
masm.loadJitActivation(scratch);
|
||||
Address checkRegs(scratch, JitActivation::offsetOfCheckRegs());
|
||||
masm.store32(Imm32(0), checkRegs);
|
||||
masm.pop(scratch);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Before doing any call to Cpp, you should ensure that volatile
|
||||
|
@ -200,6 +200,7 @@ class CodeGeneratorShared : public LInstructionVisitor
|
||||
}
|
||||
|
||||
#ifdef CHECK_OSIPOINT_REGISTERS
|
||||
void resetOsiPointRegs(LSafepoint *safepoint);
|
||||
bool shouldVerifyOsiPointRegs(LSafepoint *safepoint);
|
||||
void verifyOsiPointRegs(LSafepoint *safepoint);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user