Align code entry points to 32 bytes.
authoriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 27 Feb 2009 11:19:31 +0000 (11:19 +0000)
committeriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 27 Feb 2009 11:19:31 +0000 (11:19 +0000)
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
src/objects-debug.cc
src/objects-inl.h
src/objects.h

index ce722f0..d088463 100644 (file)
@@ -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);
index 7b7afc4..0362a15 100644 (file)
@@ -665,6 +665,8 @@ void Code::CodePrint() {
 
 void Code::CodeVerify() {
   CHECK(ic_flag() == IC_TARGET_IS_ADDRESS);
+  CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
+                  static_cast<intptr_t>(kCodeAlignment)));
   Address last_gc_pc = NULL;
   for (RelocIterator it(this); !it.done(); it.next()) {
     it.rinfo()->Verify();
index 66ca97e..9705b75 100644 (file)
@@ -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());
 }
 
 
index 555871a..65dba63 100644 (file)
@@ -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;