Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index e0d60ee1705404409127287ad4848b677f110a63..a37da264d498e1ef438e36f1c98ce36da109cb2a 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -1784,158 +1784,6 @@ |
} |
-TEST(TestAlignmentCalculations) { |
- // Maximum fill amounts should be consistent. |
- int maximum_double_misalignment = kDoubleSize - kPointerSize; |
- int max_word_fill = Heap::GetMaximumFillToAlign(kWordAligned); |
- CHECK_EQ(0, max_word_fill); |
- int max_double_fill = Heap::GetMaximumFillToAlign(kDoubleAligned); |
- CHECK_EQ(maximum_double_misalignment, max_double_fill); |
- int max_double_unaligned_fill = Heap::GetMaximumFillToAlign(kDoubleUnaligned); |
- CHECK_EQ(maximum_double_misalignment, max_double_unaligned_fill); |
- |
- Address base = reinterpret_cast<Address>(NULL); |
- int fill = 0; |
- |
- // Word alignment never requires fill. |
- fill = Heap::GetFillToAlign(base, kWordAligned); |
- CHECK_EQ(0, fill); |
- fill = Heap::GetFillToAlign(base + kPointerSize, kWordAligned); |
- CHECK_EQ(0, fill); |
- |
- // No fill is required when address is double aligned. |
- fill = Heap::GetFillToAlign(base, kDoubleAligned); |
- CHECK_EQ(0, fill); |
- // Fill is required if address is not double aligned. |
- fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleAligned); |
- CHECK_EQ(maximum_double_misalignment, fill); |
- // kDoubleUnaligned has the opposite fill amounts. |
- fill = Heap::GetFillToAlign(base, kDoubleUnaligned); |
- CHECK_EQ(maximum_double_misalignment, fill); |
- fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleUnaligned); |
- CHECK_EQ(0, fill); |
-} |
- |
- |
-static HeapObject* NewSpaceAllocateAligned(int size, |
- AllocationAlignment alignment) { |
- Heap* heap = CcTest::heap(); |
- AllocationResult allocation = |
- heap->new_space()->AllocateRawAligned(size, alignment); |
- HeapObject* obj = NULL; |
- allocation.To(&obj); |
- heap->CreateFillerObjectAt(obj->address(), size); |
- return obj; |
-} |
- |
- |
-TEST(TestAlignedAllocation) { |
- // Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones. |
- const intptr_t double_misalignment = kDoubleSize - kPointerSize; |
- if (double_misalignment) { |
- // Allocate a pointer sized object that must be double aligned. |
- Address* top_addr = CcTest::heap()->new_space()->allocation_top_address(); |
- Address start = *top_addr; |
- HeapObject* obj1 = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
- CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment)); |
- // Allocate a second pointer sized object. These two allocations should |
- // cause exactly one filler object to be created. |
- HeapObject* obj2 = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
- CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment)); |
- CHECK_EQ(2 * kPointerSize + double_misalignment, *top_addr - start); |
- // There should be 3 filler objects now (the two HeapObjects we created and |
- // the filler.) |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller() && |
- HeapObject::FromAddress(start + 2 * kPointerSize)->IsFiller()); |
- |
- // Similarly for kDoubleUnaligned. |
- start = *top_addr; |
- obj1 = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
- CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment, kPointerSize)); |
- obj2 = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
- CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment, kPointerSize)); |
- CHECK_EQ(2 * kPointerSize + double_misalignment, *top_addr - start); |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller() && |
- HeapObject::FromAddress(start + 2 * kPointerSize)->IsFiller()); |
- } |
-} |
- |
- |
-// Force allocation to happen from the free list, at a desired misalignment. |
-static Address SetUpFreeListAllocation(int misalignment) { |
- Heap* heap = CcTest::heap(); |
- OldSpace* old_space = heap->old_space(); |
- Address top = old_space->top(); |
- // First, allocate enough filler to get the linear area into the desired |
- // misalignment. |
- const intptr_t maximum_misalignment = 2 * kPointerSize; |
- const intptr_t maximum_misalignment_mask = maximum_misalignment - 1; |
- intptr_t top_alignment = OffsetFrom(top) & maximum_misalignment_mask; |
- int filler_size = misalignment - static_cast<int>(top_alignment); |
- if (filler_size < 0) filler_size += maximum_misalignment; |
- if (filler_size) { |
- // Create the filler object. |
- AllocationResult allocation = old_space->AllocateRawUnaligned(filler_size); |
- HeapObject* obj = NULL; |
- allocation.To(&obj); |
- heap->CreateFillerObjectAt(obj->address(), filler_size); |
- } |
- top = old_space->top(); |
- old_space->EmptyAllocationInfo(); |
- return top; |
-} |
- |
- |
-static HeapObject* OldSpaceAllocateAligned(int size, |
- AllocationAlignment alignment) { |
- Heap* heap = CcTest::heap(); |
- AllocationResult allocation = |
- heap->old_space()->AllocateRawAligned(size, alignment); |
- HeapObject* obj = NULL; |
- allocation.To(&obj); |
- heap->CreateFillerObjectAt(obj->address(), size); |
- return obj; |
-} |
- |
- |
-// Test the case where allocation must be done from the free list, so filler |
-// may precede or follow the object. |
-TEST(TestAlignedOverAllocation) { |
- // Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones. |
- const intptr_t double_misalignment = kDoubleSize - kPointerSize; |
- if (double_misalignment) { |
- Address start = SetUpFreeListAllocation(0); |
- HeapObject* obj1 = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
- // The object should be aligned, and a filler object should be created. |
- CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment)); |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller()); |
- // Try the opposite alignment case. |
- start = SetUpFreeListAllocation(kPointerSize); |
- HeapObject* obj2 = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
- CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment)); |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller()); |
- |
- // Similarly for kDoubleUnaligned. |
- start = SetUpFreeListAllocation(0); |
- obj1 = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
- // The object should be aligned, and a filler object should be created. |
- CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment, kPointerSize)); |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller()); |
- // Try the opposite alignment case. |
- start = SetUpFreeListAllocation(kPointerSize); |
- obj2 = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
- CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment, kPointerSize)); |
- CHECK(HeapObject::FromAddress(start)->IsFiller() && |
- HeapObject::FromAddress(start + kPointerSize)->IsFiller()); |
- } |
-} |
- |
- |
TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { |
CcTest::InitializeVM(); |
HeapIterator iterator(CcTest::heap()); |