MIPS: Interrupts must not mask stack overflow.

Port r21874 (bfea2c0)

BUG=385002
LOG=N

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21880 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 005410e8
...@@ -97,28 +97,6 @@ class JumpPatchSite BASE_EMBEDDED { ...@@ -97,28 +97,6 @@ class JumpPatchSite BASE_EMBEDDED {
}; };
static void EmitStackCheck(MacroAssembler* masm_,
Register stack_limit_scratch,
int pointers = 0,
Register scratch = sp) {
Isolate* isolate = masm_->isolate();
Label ok;
ASSERT(scratch.is(sp) == (pointers == 0));
Heap::RootListIndex index;
if (pointers != 0) {
__ Subu(scratch, sp, Operand(pointers * kPointerSize));
index = Heap::kRealStackLimitRootIndex;
} else {
index = Heap::kStackLimitRootIndex;
}
__ LoadRoot(stack_limit_scratch, index);
__ Branch(&ok, hs, scratch, Operand(stack_limit_scratch));
PredictableCodeSizeScope predictable(masm_, 4 * Assembler::kInstrSize);
__ Call(isolate->builtins()->StackCheck(), RelocInfo::CODE_TARGET);
__ bind(&ok);
}
// Generate code for a JS function. On entry to the function the receiver // Generate code for a JS function. On entry to the function the receiver
// and arguments have been pushed on the stack left to right. The actual // and arguments have been pushed on the stack left to right. The actual
// argument count matches the formal parameter count expected by the // argument count matches the formal parameter count expected by the
...@@ -185,7 +163,12 @@ void FullCodeGenerator::Generate() { ...@@ -185,7 +163,12 @@ void FullCodeGenerator::Generate() {
ASSERT(!info->function()->is_generator() || locals_count == 0); ASSERT(!info->function()->is_generator() || locals_count == 0);
if (locals_count > 0) { if (locals_count > 0) {
if (locals_count >= 128) { if (locals_count >= 128) {
EmitStackCheck(masm_, a2, locals_count, t5); Label ok;
__ Subu(t5, sp, Operand(locals_count * kPointerSize));
__ LoadRoot(a2, Heap::kRealStackLimitRootIndex);
__ Branch(&ok, hs, t5, Operand(a2));
__ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION);
__ bind(&ok);
} }
__ LoadRoot(t5, Heap::kUndefinedValueRootIndex); __ LoadRoot(t5, Heap::kUndefinedValueRootIndex);
int kMaxPushes = FLAG_optimize_for_size ? 4 : 32; int kMaxPushes = FLAG_optimize_for_size ? 4 : 32;
...@@ -328,7 +311,14 @@ void FullCodeGenerator::Generate() { ...@@ -328,7 +311,14 @@ void FullCodeGenerator::Generate() {
{ Comment cmnt(masm_, "[ Stack check"); { Comment cmnt(masm_, "[ Stack check");
PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS);
EmitStackCheck(masm_, at); Label ok;
__ LoadRoot(at, Heap::kStackLimitRootIndex);
__ Branch(&ok, hs, sp, Operand(at));
Handle<Code> stack_check = isolate()->builtins()->StackCheck();
PredictableCodeSizeScope predictable(masm_,
masm_->CallSize(stack_check, RelocInfo::CODE_TARGET));
__ Call(stack_check, RelocInfo::CODE_TARGET);
__ bind(&ok);
} }
{ Comment cmnt(masm_, "[ Body"); { Comment cmnt(masm_, "[ Body");
......
...@@ -1104,7 +1104,8 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address, ...@@ -1104,7 +1104,8 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
Code* re_code, Code* re_code,
Address re_frame) { Address re_frame) {
Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate); Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate);
if (isolate->stack_guard()->IsStackOverflow()) { StackLimitCheck check(isolate);
if (check.JsHasOverflowed()) {
isolate->StackOverflow(); isolate->StackOverflow();
return EXCEPTION; return EXCEPTION;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment