Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1104)

Unified Diff: src/serialize.cc

Issue 759823006: Ensure double alignment when deserializing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: disable check Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/heap/heap.cc ('K') | « src/serialize.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/serialize.cc
diff --git a/src/serialize.cc b/src/serialize.cc
index c2dd338b7ec5c3151a4f9e7606a324f72d9aa8d2..b9d19ad0aa22fa0a2f7d0e8966588a7cb065281e 100644
--- a/src/serialize.cc
+++ b/src/serialize.cc
@@ -807,11 +807,21 @@ Object* Deserializer::ProcessBackRefInSerializedCode(Object* obj) {
// The reason for this strange interface is that otherwise the object is
// written very late, which means the FreeSpace map is not set up by the
// time we need to use it to mark the space at the end of a page free.
-void Deserializer::ReadObject(int space_number,
- Object** write_back) {
+void Deserializer::ReadObject(int space_number, Object** write_back,
+ bool double_align) {
int size = source_->GetInt() << kObjectAlignmentBits;
- Address address = Allocate(space_number, size);
- HeapObject* obj = HeapObject::FromAddress(address);
+ Address address;
+ HeapObject* obj;
+ if (double_align) {
+ DCHECK_NE(LO_SPACE, space_number);
+ address = Allocate(space_number, size + kPointerSize);
rmcilroy 2014/11/26 17:44:40 You should only need to add kPointerSize if not a
Yang 2014/11/26 18:59:49 I think this entire if-branch can be omitted for 6
rmcilroy 2014/11/26 19:24:46 agreed.
+ obj = isolate_->heap()->DoubleAlignForDeserialization(
+ HeapObject::FromAddress(address), size + kPointerSize);
+ address = obj->address();
+ } else {
+ address = Allocate(space_number, size);
+ obj = HeapObject::FromAddress(address);
+ }
isolate_->heap()->OnAllocationEvent(obj, size);
Object** current = reinterpret_cast<Object**>(address);
Object** limit = current + (size >> kPointerSizeLog2);
@@ -894,6 +904,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
source_space != PROPERTY_CELL_SPACE &&
source_space != CODE_SPACE &&
source_space != OLD_DATA_SPACE);
+ bool double_align_next_object = false;
while (current < limit) {
int data = source_->Get();
switch (data) {
@@ -911,13 +922,16 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
int space_number = space_number_if_any == kAnyOldSpace \
? (data & kSpaceMask) \
: space_number_if_any; \
+ DCHECK(!double_align_next_object || where == kNewObject); \
if (where == kNewObject && how == kPlain && within == kStartOfObject) { \
- ReadObject(space_number, current); \
+ ReadObject(space_number, current, double_align_next_object); \
+ double_align_next_object = false; \
emit_write_barrier = (space_number == NEW_SPACE); \
} else { \
Object* new_object = NULL; /* May not be a real Object pointer. */ \
if (where == kNewObject) { \
- ReadObject(space_number, &new_object); \
+ ReadObject(space_number, &new_object, double_align_next_object); \
+ double_align_next_object = false; \
} else if (where == kRootArray) { \
int root_id = source_->GetInt(); \
new_object = isolate->heap()->roots_array_start()[root_id]; \
@@ -1238,6 +1252,14 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
break;
}
+#ifndef V8_HOST_ARCH_64_BIT
+ case kDoubleAlignPrefix: {
+ DCHECK(!double_align_next_object);
+ double_align_next_object = true;
+ break;
+ }
+#endif
+
case kSynchronize: {
// If we get here then that indicates that you have a mismatch between
// the number of GC roots when serializing and deserializing.
@@ -1549,6 +1571,14 @@ void PartialSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code,
void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space,
int size, Map* map) {
+ int reserved_size = size;
+ // Objects on the large object space are always double-aligned.
+ if (space != LO_SPACE && object_->NeedsToEnsureDoubleAlignment()) {
+ sink_->Put(kDoubleAlignPrefix, "double align next object");
+ // Add wriggle room for double alignment padding.
+ reserved_size += kPointerSize;
+ }
+
sink_->Put(kNewObject + reference_representation_ + space,
"ObjectSerialization");
sink_->PutInt(size >> kObjectAlignmentBits, "Size in words");
@@ -1572,7 +1602,7 @@ void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space,
}
back_reference = serializer_->AllocateLargeObject(size);
} else {
- back_reference = serializer_->Allocate(space, size);
+ back_reference = serializer_->Allocate(space, reserved_size);
}
serializer_->back_reference_map()->Add(object_, back_reference);
@@ -1918,7 +1948,7 @@ BackReference Serializer::AllocateLargeObject(int size) {
BackReference Serializer::Allocate(AllocationSpace space, int size) {
- CHECK(space >= 0 && space < kNumberOfPreallocatedSpaces);
+ DCHECK(space >= 0 && space < kNumberOfPreallocatedSpaces);
DCHECK(size > 0 && size <= static_cast<int>(max_chunk_size(space)));
uint32_t new_chunk_size = pending_chunk_[space] + size;
if (new_chunk_size > max_chunk_size(space)) {
« src/heap/heap.cc ('K') | « src/serialize.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698