mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1034330 - OdinMonkey: hoist OOM handling (r=bbouvier)
--HG-- extra : rebase_source : cbe5c2e0a6f57afcb7506a39e51b3eca612702ea
This commit is contained in:
parent
dc3d8c91c0
commit
4be5d38f6b
@ -1849,7 +1849,8 @@ CodeGeneratorARM::visitAsmJSLoadHeap(LAsmJSLoadHeap *ins)
|
||||
masm.ma_mov(Imm32(0), d, NoSetCond, Assembler::AboveOrEqual);
|
||||
masm.ma_dataTransferN(IsLoad, size, isSigned, HeapReg, ptrReg, d, Offset, Assembler::Below);
|
||||
}
|
||||
return masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -1916,7 +1917,8 @@ CodeGeneratorARM::visitAsmJSStoreHeap(LAsmJSStoreHeap *ins)
|
||||
masm.ma_dataTransferN(IsStore, size, isSigned, HeapReg, ptrReg,
|
||||
ToRegister(ins->value()), Offset, Assembler::Below);
|
||||
}
|
||||
return masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -2067,7 +2067,7 @@ MacroAssemblerARMCompat::movePtr(AsmJSImmPtr imm, Register dest)
|
||||
else
|
||||
rs = L_LDR;
|
||||
|
||||
enoughMemory_ &= append(AsmJSAbsoluteLink(CodeOffsetLabel(nextOffset().getOffset()), imm.kind()));
|
||||
append(AsmJSAbsoluteLink(CodeOffsetLabel(nextOffset().getOffset()), imm.kind()));
|
||||
ma_movPatchable(Imm32(-1), dest, Always, rs);
|
||||
}
|
||||
void
|
||||
|
@ -566,11 +566,11 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
||||
}
|
||||
void call(const CallSiteDesc &desc, const Register reg) {
|
||||
call(reg);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
void call(const CallSiteDesc &desc, Label *label) {
|
||||
call(label);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
|
||||
void branch(JitCode *c) {
|
||||
|
@ -1985,7 +1985,8 @@ CodeGeneratorMIPS::visitAsmJSLoadHeap(LAsmJSLoadHeap *ins)
|
||||
}
|
||||
masm.bind(&done);
|
||||
|
||||
return masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -2061,7 +2062,8 @@ CodeGeneratorMIPS::visitAsmJSStoreHeap(LAsmJSStoreHeap *ins)
|
||||
}
|
||||
masm.bind(&rejoin);
|
||||
|
||||
return masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
masm.append(AsmJSHeapAccess(bo.getOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -1795,8 +1795,7 @@ MacroAssemblerMIPSCompat::movePtr(ImmPtr imm, Register dest)
|
||||
void
|
||||
MacroAssemblerMIPSCompat::movePtr(AsmJSImmPtr imm, Register dest)
|
||||
{
|
||||
enoughMemory_ &= append(AsmJSAbsoluteLink(CodeOffsetLabel(nextOffset().getOffset()),
|
||||
imm.kind()));
|
||||
append(AsmJSAbsoluteLink(CodeOffsetLabel(nextOffset().getOffset()), imm.kind()));
|
||||
ma_liPatchable(dest, Imm32(-1));
|
||||
}
|
||||
|
||||
|
@ -414,11 +414,11 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
|
||||
}
|
||||
void call(const CallSiteDesc &desc, const Register reg) {
|
||||
call(reg);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
void call(const CallSiteDesc &desc, Label *label) {
|
||||
call(label);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
|
||||
void branch(JitCode *c) {
|
||||
|
@ -800,21 +800,22 @@ class AssemblerShared
|
||||
return !enoughMemory_;
|
||||
}
|
||||
|
||||
bool append(const CallSiteDesc &desc, size_t currentOffset, size_t framePushed) {
|
||||
void append(const CallSiteDesc &desc, size_t currentOffset, size_t framePushed) {
|
||||
// framePushed does not include AsmJSFrameSize, so add it in here (see
|
||||
// CallSite::stackDepth).
|
||||
return callsites_.append(CallSite(desc, currentOffset, framePushed + AsmJSFrameSize));
|
||||
CallSite callsite(desc, currentOffset, framePushed + AsmJSFrameSize);
|
||||
enoughMemory_ &= callsites_.append(callsite);
|
||||
}
|
||||
CallSiteVector &&extractCallSites() { return Move(callsites_); }
|
||||
|
||||
bool append(AsmJSHeapAccess access) { return asmJSHeapAccesses_.append(access); }
|
||||
void append(AsmJSHeapAccess access) { enoughMemory_ &= asmJSHeapAccesses_.append(access); }
|
||||
AsmJSHeapAccessVector &&extractAsmJSHeapAccesses() { return Move(asmJSHeapAccesses_); }
|
||||
|
||||
bool append(AsmJSGlobalAccess access) { return asmJSGlobalAccesses_.append(access); }
|
||||
void append(AsmJSGlobalAccess access) { enoughMemory_ &= asmJSGlobalAccesses_.append(access); }
|
||||
size_t numAsmJSGlobalAccesses() const { return asmJSGlobalAccesses_.length(); }
|
||||
AsmJSGlobalAccess asmJSGlobalAccess(size_t i) const { return asmJSGlobalAccesses_[i]; }
|
||||
|
||||
bool append(AsmJSAbsoluteLink link) { return asmJSAbsoluteLinks_.append(link); }
|
||||
void append(AsmJSAbsoluteLink link) { enoughMemory_ &= asmJSAbsoluteLinks_.append(link); }
|
||||
size_t numAsmJSAbsoluteLinks() const { return asmJSAbsoluteLinks_.length(); }
|
||||
AsmJSAbsoluteLink asmJSAbsoluteLink(size_t i) const { return asmJSAbsoluteLinks_[i]; }
|
||||
};
|
||||
|
@ -669,11 +669,11 @@ class MacroAssemblerX86Shared : public Assembler
|
||||
|
||||
void call(const CallSiteDesc &desc, Label *label) {
|
||||
call(label);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
void call(const CallSiteDesc &desc, Register reg) {
|
||||
call(reg);
|
||||
enoughMemory_ &= append(desc, currentOffset(), framePushed_);
|
||||
append(desc, currentOffset(), framePushed_);
|
||||
}
|
||||
void callIon(Register callee) {
|
||||
call(callee);
|
||||
|
@ -545,7 +545,7 @@ class Assembler : public AssemblerX86Shared
|
||||
}
|
||||
void mov(AsmJSImmPtr imm, Register dest) {
|
||||
masm.movq_i64r(-1, dest.code());
|
||||
enoughMemory_ &= append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), imm.kind()));
|
||||
append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), imm.kind()));
|
||||
}
|
||||
void mov(const Operand &src, Register dest) {
|
||||
movq(src, dest);
|
||||
|
@ -274,7 +274,9 @@ CodeGeneratorX64::visitAsmJSLoadHeap(LAsmJSLoadHeap *ins)
|
||||
default: MOZ_ASSUME_UNREACHABLE("unexpected array type");
|
||||
}
|
||||
uint32_t after = masm.size();
|
||||
return skipNote || masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(ins->output())));
|
||||
if (!skipNote)
|
||||
masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(ins->output())));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -322,7 +324,9 @@ CodeGeneratorX64::visitAsmJSStoreHeap(LAsmJSStoreHeap *ins)
|
||||
}
|
||||
}
|
||||
uint32_t after = masm.size();
|
||||
return skipNote || masm.append(AsmJSHeapAccess(before, after));
|
||||
if (!skipNote)
|
||||
masm.append(AsmJSHeapAccess(before, after));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -336,7 +340,8 @@ CodeGeneratorX64::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar *ins)
|
||||
else
|
||||
label = masm.loadRipRelativeDouble(ToFloatRegister(ins->output()));
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -353,7 +358,8 @@ CodeGeneratorX64::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar *ins)
|
||||
else
|
||||
label = masm.storeRipRelativeDouble(ToFloatRegister(ins->value()));
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -368,7 +374,8 @@ CodeGeneratorX64::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr *ins)
|
||||
CodeOffsetLabel label = masm.leaRipRelative(tmp);
|
||||
masm.loadPtr(Operand(tmp, index, TimesEight, 0), out);
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -378,7 +385,8 @@ CodeGeneratorX64::visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc *ins)
|
||||
|
||||
CodeOffsetLabel label = masm.loadRipRelativeInt64(ToRegister(ins->output()));
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -260,7 +260,7 @@ class Assembler : public AssemblerX86Shared
|
||||
}
|
||||
void mov(AsmJSImmPtr imm, Register dest) {
|
||||
masm.movl_i32r(-1, dest.code());
|
||||
enoughMemory_ &= append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), imm.kind()));
|
||||
append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), imm.kind()));
|
||||
}
|
||||
void mov(const Operand &src, Register dest) {
|
||||
movl(src, dest);
|
||||
@ -341,7 +341,7 @@ class Assembler : public AssemblerX86Shared
|
||||
}
|
||||
void cmpl(AsmJSAbsoluteAddress lhs, Register rhs) {
|
||||
masm.cmpl_rm_force32(rhs.code(), (void*)-1);
|
||||
enoughMemory_ &= append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), lhs.kind()));
|
||||
append(AsmJSAbsoluteLink(CodeOffsetLabel(masm.currentOffset()), lhs.kind()));
|
||||
}
|
||||
CodeOffsetLabel cmplWithPatch(Register lhs, Imm32 rhs) {
|
||||
masm.cmpl_ir_force32(rhs.value, lhs.code());
|
||||
|
@ -308,7 +308,8 @@ CodeGeneratorX86::loadAndNoteViewTypeElement(ArrayBufferView::ViewType vt, const
|
||||
uint32_t before = masm.size();
|
||||
loadViewTypeElement(vt, srcAddr, out);
|
||||
uint32_t after = masm.size();
|
||||
return masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(out)));
|
||||
masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(out)));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -381,7 +382,8 @@ CodeGeneratorX86::visitAsmJSLoadHeap(LAsmJSLoadHeap *ins)
|
||||
loadViewTypeElement(vt, srcAddr, out);
|
||||
uint32_t after = masm.size();
|
||||
masm.bind(ool->rejoin());
|
||||
return masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(out), cmp.offset()));
|
||||
masm.append(AsmJSHeapAccess(before, after, vt, ToAnyRegister(out), cmp.offset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -420,14 +422,14 @@ CodeGeneratorX86::storeViewTypeElement(ArrayBufferView::ViewType vt, const LAllo
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool
|
||||
void
|
||||
CodeGeneratorX86::storeAndNoteViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
|
||||
const T &dstAddr)
|
||||
{
|
||||
uint32_t before = masm.size();
|
||||
storeViewTypeElement(vt, value, dstAddr);
|
||||
uint32_t after = masm.size();
|
||||
return masm.append(AsmJSHeapAccess(before, after));
|
||||
masm.append(AsmJSHeapAccess(before, after));
|
||||
}
|
||||
|
||||
bool
|
||||
@ -463,14 +465,17 @@ CodeGeneratorX86::visitAsmJSStoreHeap(LAsmJSStoreHeap *ins)
|
||||
// immediate in the instruction. This displacement will fixed up when the
|
||||
// base address is known during dynamic linking (AsmJSModule::initHeap).
|
||||
PatchedAbsoluteAddress dstAddr((void *) ptr->toConstant()->toInt32());
|
||||
return storeAndNoteViewTypeElement(vt, value, dstAddr);
|
||||
storeAndNoteViewTypeElement(vt, value, dstAddr);
|
||||
return true;
|
||||
}
|
||||
|
||||
Register ptrReg = ToRegister(ptr);
|
||||
Address dstAddr(ptrReg, 0);
|
||||
|
||||
if (mir->skipBoundsCheck())
|
||||
return storeAndNoteViewTypeElement(vt, value, dstAddr);
|
||||
if (mir->skipBoundsCheck()) {
|
||||
storeAndNoteViewTypeElement(vt, value, dstAddr);
|
||||
return true;
|
||||
}
|
||||
|
||||
CodeOffsetLabel cmp = masm.cmplWithPatch(ptrReg, Imm32(0));
|
||||
Label rejoin;
|
||||
@ -480,7 +485,8 @@ CodeGeneratorX86::visitAsmJSStoreHeap(LAsmJSStoreHeap *ins)
|
||||
storeViewTypeElement(vt, value, dstAddr);
|
||||
uint32_t after = masm.size();
|
||||
masm.bind(&rejoin);
|
||||
return masm.append(AsmJSHeapAccess(before, after, cmp.offset()));
|
||||
masm.append(AsmJSHeapAccess(before, after, cmp.offset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -498,7 +504,8 @@ CodeGeneratorX86::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar *ins)
|
||||
else
|
||||
label = masm.movsdWithPatch(PatchedAbsoluteAddress(), ToFloatRegister(ins->output()));
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -517,7 +524,8 @@ CodeGeneratorX86::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar *ins)
|
||||
else
|
||||
label = masm.movsdWithPatch(ToFloatRegister(ins->value()), PatchedAbsoluteAddress());
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -529,7 +537,8 @@ CodeGeneratorX86::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr *ins)
|
||||
Register out = ToRegister(ins->output());
|
||||
CodeOffsetLabel label = masm.movlWithPatch(PatchedAbsoluteAddress(), index, TimesFour, out);
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -540,7 +549,8 @@ CodeGeneratorX86::visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc *ins)
|
||||
Register out = ToRegister(ins->output());
|
||||
CodeOffsetLabel label = masm.movlWithPatch(PatchedAbsoluteAddress(), out);
|
||||
|
||||
return masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
masm.append(AsmJSGlobalAccess(CodeOffsetLabel(label.offset()), mir->globalDataOffset()));
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -36,7 +36,7 @@ class CodeGeneratorX86 : public CodeGeneratorX86Shared
|
||||
void loadViewTypeElement(ArrayBufferView::ViewType vt, const T &srcAddr,
|
||||
const LDefinition *out);
|
||||
template<typename T>
|
||||
bool storeAndNoteViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
|
||||
void storeAndNoteViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
|
||||
const T &dstAddr);
|
||||
template<typename T>
|
||||
void storeViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
|
||||
|
Loading…
Reference in New Issue
Block a user