From 56753adbb872472015511c9ba499cace2c13518a Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Mon, 7 Mar 2011 10:30:58 +0000 Subject: [PATCH] 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 --- src/x64/lithium-codegen-x64.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index f9b84da..5350017 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -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_; }; -- 2.7.4