ARM: Fix deoptimizer for two-word call sites.
R=svenpanne@chromium.org,kmillikin@chromium.org BUG=v8:1584 Review URL: http://codereview.chromium.org/7585006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8868 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c02bc26a5a
commit
c68d205c08
@ -65,8 +65,6 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
|
||||
|
||||
// For each return after a safepoint insert an absolute call to the
|
||||
// corresponding deoptimization entry.
|
||||
ASSERT(patch_size() % Assembler::kInstrSize == 0);
|
||||
int call_size_in_words = patch_size() / Assembler::kInstrSize;
|
||||
unsigned last_pc_offset = 0;
|
||||
SafepointTable table(function->code());
|
||||
for (unsigned i = 0; i < table.length(); i++) {
|
||||
@ -87,13 +85,18 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
|
||||
#endif
|
||||
last_pc_offset = pc_offset;
|
||||
if (deoptimization_index != Safepoint::kNoDeoptimizationIndex) {
|
||||
last_pc_offset += gap_code_size;
|
||||
CodePatcher patcher(code->instruction_start() + last_pc_offset,
|
||||
call_size_in_words);
|
||||
Address deoptimization_entry = Deoptimizer::GetDeoptimizationEntry(
|
||||
deoptimization_index, Deoptimizer::LAZY);
|
||||
last_pc_offset += gap_code_size;
|
||||
int call_size_in_bytes = MacroAssembler::CallSize(deoptimization_entry,
|
||||
RelocInfo::NONE);
|
||||
int call_size_in_words = call_size_in_bytes / Assembler::kInstrSize;
|
||||
ASSERT(call_size_in_bytes % Assembler::kInstrSize == 0);
|
||||
ASSERT(call_size_in_bytes <= patch_size());
|
||||
CodePatcher patcher(code->instruction_start() + last_pc_offset,
|
||||
call_size_in_words);
|
||||
patcher.masm()->Call(deoptimization_entry, RelocInfo::NONE);
|
||||
last_pc_offset += patch_size();
|
||||
last_pc_offset += call_size_in_bytes;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,14 +92,16 @@ class MacroAssembler: public Assembler {
|
||||
void Jump(Register target, Condition cond = al);
|
||||
void Jump(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
void Jump(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(Register target, Condition cond = al);
|
||||
static int CallSize(Register target, Condition cond = al);
|
||||
void Call(Register target, Condition cond = al);
|
||||
int CallSize(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
static int CallSize(Address target,
|
||||
RelocInfo::Mode rmode,
|
||||
Condition cond = al);
|
||||
void Call(Address target, RelocInfo::Mode rmode, Condition cond = al);
|
||||
int CallSize(Handle<Code> code,
|
||||
RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
|
||||
unsigned ast_id = kNoASTId,
|
||||
Condition cond = al);
|
||||
static int CallSize(Handle<Code> code,
|
||||
RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
|
||||
unsigned ast_id = kNoASTId,
|
||||
Condition cond = al);
|
||||
void Call(Handle<Code> code,
|
||||
RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
|
||||
unsigned ast_id = kNoASTId,
|
||||
|
Loading…
Reference in New Issue
Block a user