Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| =================================================================== |
| --- src/ia32/lithium-codegen-ia32.cc (revision 6795) |
| +++ src/ia32/lithium-codegen-ia32.cc (working copy) |
| @@ -43,13 +43,22 @@ |
| public: |
| SafepointGenerator(LCodeGen* codegen, |
| LPointerMap* pointers, |
| - int deoptimization_index) |
| + int deoptimization_index, |
| + bool ensure_reloc_space = false) |
| : codegen_(codegen), |
| pointers_(pointers), |
| - deoptimization_index_(deoptimization_index) { } |
| + deoptimization_index_(deoptimization_index), |
| + ensure_reloc_space_(ensure_reloc_space) { } |
| virtual ~SafepointGenerator() { } |
| virtual void Generate() { |
| + // Ensure that we have enough space in the reloc info to patch |
| + // this with calls when doing deoptimization. |
| + PrintF("--------------------GEEEEEEE-------------------\n"); |
|
Mads Ager (chromium)
2011/02/16 07:26:12
Remove please.
Rico
2011/02/16 07:31:13
Done.
|
| + if (ensure_reloc_space_) { |
| + PrintF("--------------------FILLING-------------------\n"); |
|
Mads Ager (chromium)
2011/02/16 07:26:12
Remove please.
Rico
2011/02/16 07:31:13
Done.
|
| + codegen_->masm()->RecordComment(RelocInfo::kFillerCommentString, true); |
| + } |
| codegen_->RecordSafepoint(pointers_, deoptimization_index_); |
| } |
| @@ -57,6 +66,7 @@ |
| LCodeGen* codegen_; |
| LPointerMap* pointers_; |
| int deoptimization_index_; |
| + bool ensure_reloc_space_; |
| }; |
| @@ -77,7 +87,7 @@ |
| void LCodeGen::FinishCode(Handle<Code> code) { |
| ASSERT(is_done()); |
| code->set_stack_slots(StackSlotCount()); |
| - code->set_safepoint_table_start(safepoints_.GetCodeOffset()); |
| + code->set_safepoint_table_offset(safepoints_.GetCodeOffset()); |
| PopulateDeoptimizationData(code); |
| } |
| @@ -2146,7 +2156,8 @@ |
| RegisterEnvironmentForDeoptimization(env); |
| SafepointGenerator safepoint_generator(this, |
| pointers, |
| - env->deoptimization_index()); |
| + env->deoptimization_index(), |
| + true); |
| ASSERT(receiver.is(eax)); |
| v8::internal::ParameterCount actual(eax); |
| __ InvokeFunction(edi, actual, CALL_FUNCTION, &safepoint_generator); |
| @@ -2204,6 +2215,10 @@ |
| if (*function == *graph()->info()->closure()) { |
| __ CallSelf(); |
| } else { |
| + // This is an indirect call and will not be recorded in the reloc info. |
| + // Add a comment to the reloc info in case we need to patch this during |
| + // deoptimization. |
| + __ RecordComment(RelocInfo::kFillerCommentString, true); |
| __ call(FieldOperand(edi, JSFunction::kCodeEntryOffset)); |
| } |
| @@ -3584,9 +3599,14 @@ |
| LEnvironment* env = instr->deoptimization_environment(); |
| RecordPosition(pointers->position()); |
| RegisterEnvironmentForDeoptimization(env); |
| + // Create safepoint generator that will also ensure enough space in the |
| + // reloc info for patching in deoptimization (since this is invoking a |
| + // builtin) |
| + |
| SafepointGenerator safepoint_generator(this, |
| pointers, |
| - env->deoptimization_index()); |
| + env->deoptimization_index(), |
| + true); |
| __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, &safepoint_generator); |
| } |