From: iposva@chromium.org Date: Fri, 27 Feb 2009 11:19:31 +0000 (+0000) Subject: Align code entry points to 32 bytes. X-Git-Tag: upstream/4.7.83~24608 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f5966c38159abb96ff852fee4a4a8c06dbd410c8;p=platform%2Fupstream%2Fv8.git Align code entry points to 32 bytes. Review URL: http://codereview.chromium.org/27269 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1386 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/heap.cc b/src/heap.cc index ce722f043..d0884634b 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -1631,6 +1631,7 @@ Object* Heap::CreateCode(const CodeDesc& desc, int sinfo_size = 0; if (sinfo != NULL) sinfo_size = sinfo->Serialize(NULL); int obj_size = Code::SizeFor(body_size, sinfo_size); + ASSERT(IsAligned(obj_size, Code::kCodeAlignment)); Object* result; if (obj_size > MaxHeapObjectSize()) { result = lo_space_->AllocateRawCode(obj_size); diff --git a/src/objects-debug.cc b/src/objects-debug.cc index 7b7afc46b..0362a15aa 100644 --- a/src/objects-debug.cc +++ b/src/objects-debug.cc @@ -665,6 +665,8 @@ void Code::CodePrint() { void Code::CodeVerify() { CHECK(ic_flag() == IC_TARGET_IS_ADDRESS); + CHECK(IsAligned(reinterpret_cast(instruction_start()), + static_cast(kCodeAlignment))); Address last_gc_pc = NULL; for (RelocIterator it(this); !it.done(); it.next()) { it.rinfo()->Verify(); diff --git a/src/objects-inl.h b/src/objects-inl.h index 66ca97ef4..9705b7537 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -2281,7 +2281,7 @@ int Code::body_size() { byte* Code::relocation_start() { - return FIELD_ADDR(this, CodeSize() - sinfo_size() - relocation_size()); + return FIELD_ADDR(this, kHeaderSize + instruction_size()); } @@ -2297,7 +2297,7 @@ bool Code::contains(byte* pc) { byte* Code::sinfo_start() { - return FIELD_ADDR(this, CodeSize() - sinfo_size()); + return FIELD_ADDR(this, kHeaderSize + body_size()); } diff --git a/src/objects.h b/src/objects.h index 555871a16..65dba6309 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2255,7 +2255,7 @@ class Code: public HeapObject { static int SizeFor(int body_size, int sinfo_size) { ASSERT_SIZE_TAG_ALIGNED(body_size); ASSERT_SIZE_TAG_ALIGNED(sinfo_size); - return kHeaderSize + body_size + sinfo_size; + return RoundUp(kHeaderSize + body_size + sinfo_size, kCodeAlignment); } // Locating source position. @@ -2279,7 +2279,14 @@ class Code: public HeapObject { static const int kSInfoSizeOffset = kRelocationSizeOffset + kIntSize; static const int kFlagsOffset = kSInfoSizeOffset + kIntSize; static const int kKindSpecificFlagsOffset = kFlagsOffset + kIntSize; - static const int kHeaderSize = kKindSpecificFlagsOffset + kIntSize; + // Add filler objects to align the instruction start following right after + // the Code object header. + static const int kFiller6Offset = kKindSpecificFlagsOffset + kIntSize; + static const int kFiller7Offset = kFiller6Offset + kIntSize; + static const int kHeaderSize = kFiller7Offset + kIntSize; + + // Code entry points are aligned to 32 bytes. + static const int kCodeAlignment = 32; // Byte offsets within kKindSpecificFlagsOffset. static const int kICFlagOffset = kKindSpecificFlagsOffset + 0;