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);
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();
byte* Code::relocation_start() {
- return FIELD_ADDR(this, CodeSize() - sinfo_size() - relocation_size());
+ return FIELD_ADDR(this, kHeaderSize + instruction_size());
}
byte* Code::sinfo_start() {
- return FIELD_ADDR(this, CodeSize() - sinfo_size());
+ return FIELD_ADDR(this, kHeaderSize + body_size());
}
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.
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;