Index: src/ia32/lithium-codegen-ia32.cc |
=================================================================== |
--- src/ia32/lithium-codegen-ia32.cc (revision 6787) |
+++ src/ia32/lithium-codegen-ia32.cc (working copy) |
@@ -43,13 +43,20 @@ |
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. |
+ if (ensure_reloc_space_) { |
+ codegen_->masm()->RecordComment(RelocInfo::kFillerCommentString, true); |
+ } |
codegen_->RecordSafepoint(pointers_, deoptimization_index_); |
} |
@@ -57,6 +64,7 @@ |
LCodeGen* codegen_; |
LPointerMap* pointers_; |
int deoptimization_index_; |
+ bool ensure_reloc_space_; |
}; |
@@ -2221,7 +2229,8 @@ |
RegisterEnvironmentForDeoptimization(env); |
SafepointGenerator safepoint_generator(this, |
pointers, |
- env->deoptimization_index()); |
+ env->deoptimization_index(), |
+ true); |
v8::internal::ParameterCount actual(eax); |
__ InvokeFunction(function, actual, CALL_FUNCTION, &safepoint_generator); |
} |
@@ -2292,6 +2301,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)); |
} |
@@ -3731,9 +3744,13 @@ |
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); |
__ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
__ push(Immediate(Smi::FromInt(strict_mode_flag()))); |
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, &safepoint_generator); |