From f5966c38159abb96ff852fee4a4a8c06dbd410c8 Mon Sep 17 00:00:00 2001 From: "iposva@chromium.org" Date: Fri, 27 Feb 2009 11:19:31 +0000 Subject: [PATCH] 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 --- src/heap.cc | 1 + src/objects-debug.cc | 2 ++ src/objects-inl.h | 4 ++-- src/objects.h | 11 +++++++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/heap.cc b/src/heap.cc index ce722f0..d088463 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 7b7afc4..0362a15 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 66ca97e..9705b75 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 555871a..65dba63 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; -- 2.7.4