X64: Ensure that there is always room for a call between recoreded safepoints.
Fixes issue 1234. BUG=v8:1234 Review URL: http://codereview.chromium.org/6624053 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7072 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
3ea38d412b
commit
56753adbb8
@ -48,23 +48,39 @@ class SafepointGenerator : public PostCallGenerator {
|
||||
: codegen_(codegen),
|
||||
pointers_(pointers),
|
||||
deoptimization_index_(deoptimization_index),
|
||||
ensure_reloc_space_(ensure_reloc_space) { }
|
||||
ensure_reloc_space_(ensure_reloc_space),
|
||||
previous_safepoint_position_(-kMinSafepointSize) { }
|
||||
virtual ~SafepointGenerator() { }
|
||||
|
||||
virtual void Generate() {
|
||||
// Ensure that we have enough space after the previous safepoint position
|
||||
// for the generated code there.
|
||||
int position = codegen_->masm()->pc_offset();
|
||||
ASSERT(position > previous_safepoint_position_);
|
||||
if (position < previous_safepoint_position_ + kMinSafepointSize) {
|
||||
int padding_size =
|
||||
previous_safepoint_position_ + kMinSafepointSize - position;
|
||||
STATIC_ASSERT(kMinSafepointSize <= 9); // One multibyte nop is enough.
|
||||
codegen_->masm()->nop(padding_size);
|
||||
position += padding_size;
|
||||
}
|
||||
// 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_);
|
||||
previous_safepoint_position_ = position;
|
||||
}
|
||||
|
||||
private:
|
||||
static const int kMinSafepointSize =
|
||||
MacroAssembler::kShortCallInstructionLength;
|
||||
LCodeGen* codegen_;
|
||||
LPointerMap* pointers_;
|
||||
int deoptimization_index_;
|
||||
bool ensure_reloc_space_;
|
||||
int previous_safepoint_position_;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user