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:
parent
5d3432b530
commit
a314fa4581
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user