Bug 1034330 - OdinMonkey: hoist OOM handling (r=bbouvier)

--HG--
extra : rebase_source : cbe5c2e0a6f57afcb7506a39e51b3eca612702ea
This commit is contained in:
Luke Wagner 2014-07-03 16:15:37 -05:00
parent dc3d8c91c0
commit 4be5d38f6b
13 changed files with 63 additions and 41 deletions

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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));
}

View File

@ -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) {

View File

@ -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]; }
};

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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());

View File

@ -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

View File

@ -36,8 +36,8 @@ 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,
const T &dstAddr);
void storeAndNoteViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
const T &dstAddr);
template<typename T>
void storeViewTypeElement(ArrayBufferView::ViewType vt, const LAllocation *value,
const T &dstAddr);