ARM: Add deferred stack overflow checks to goto code generation in ARM

lithium when needed.

Review URL: http://codereview.chromium.org/6192005

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6265 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
ager@chromium.org 2011-01-11 12:32:00 +00:00
parent 5d3432b530
commit a314fa4581

View File

@ -1150,24 +1150,47 @@ void LCodeGen::DoBranch(LBranch* instr) {
void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) { void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) {
// TODO(srdjan): Perform stack overflow check if this goto needs it
// before jumping.
block = chunk_->LookupDestination(block); block = chunk_->LookupDestination(block);
int next_block = GetNextEmittedBlock(current_block_); int next_block = GetNextEmittedBlock(current_block_);
if (block != next_block) { if (block != next_block) {
__ jmp(chunk_->GetAssemblyLabel(block)); // Perform stack overflow check if this goto needs it before jumping.
if (deferred_stack_check != NULL) {
__ LoadRoot(ip, Heap::kStackLimitRootIndex);
__ cmp(sp, Operand(ip));
__ b(hs, chunk_->GetAssemblyLabel(block));
__ jmp(deferred_stack_check->entry());
deferred_stack_check->SetExit(chunk_->GetAssemblyLabel(block));
} else {
__ jmp(chunk_->GetAssemblyLabel(block));
}
} }
} }
void LCodeGen::DoDeferredStackCheck(LGoto* instr) { void LCodeGen::DoDeferredStackCheck(LGoto* instr) {
UNIMPLEMENTED(); __ PushSafepointRegisters();
__ CallRuntimeSaveDoubles(Runtime::kStackGuard);
RecordSafepointWithRegisters(
instr->pointer_map(), 0, Safepoint::kNoDeoptimizationIndex);
__ PopSafepointRegisters();
} }
void LCodeGen::DoGoto(LGoto* instr) { void LCodeGen::DoGoto(LGoto* instr) {
// TODO(srdjan): Implement deferred stack check. class DeferredStackCheck: public LDeferredCode {
EmitGoto(instr->block_id(), NULL); public:
DeferredStackCheck(LCodeGen* codegen, LGoto* instr)
: LDeferredCode(codegen), instr_(instr) { }
virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
private:
LGoto* instr_;
};
DeferredStackCheck* deferred = NULL;
if (instr->include_stack_check()) {
deferred = new DeferredStackCheck(this, instr);
}
EmitGoto(instr->block_id(), deferred);
} }