| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1862 if (collector->sweeping_in_progress()) { | 1862 if (collector->sweeping_in_progress()) { |
| 1863 collector->EnsureSweepingCompleted(); | 1863 collector->EnsureSweepingCompleted(); |
| 1864 } | 1864 } |
| 1865 CHECK_EQ(initial_size, static_cast<int>(heap->SizeOfObjects())); | 1865 CHECK_EQ(initial_size, static_cast<int>(heap->SizeOfObjects())); |
| 1866 } | 1866 } |
| 1867 | 1867 |
| 1868 | 1868 |
| 1869 TEST(TestAlignmentCalculations) { | 1869 TEST(TestAlignmentCalculations) { |
| 1870 // Maximum fill amounts are consistent. | 1870 // Maximum fill amounts are consistent. |
| 1871 int maximum_double_misalignment = kDoubleSize - kPointerSize; | 1871 int maximum_double_misalignment = kDoubleSize - kPointerSize; |
| 1872 int maximum_simd128_misalignment = kSimd128Size - kPointerSize; | |
| 1873 int max_word_fill = Heap::GetMaximumFillToAlign(kWordAligned); | 1872 int max_word_fill = Heap::GetMaximumFillToAlign(kWordAligned); |
| 1874 CHECK_EQ(0, max_word_fill); | 1873 CHECK_EQ(0, max_word_fill); |
| 1875 int max_double_fill = Heap::GetMaximumFillToAlign(kDoubleAligned); | 1874 int max_double_fill = Heap::GetMaximumFillToAlign(kDoubleAligned); |
| 1876 CHECK_EQ(maximum_double_misalignment, max_double_fill); | 1875 CHECK_EQ(maximum_double_misalignment, max_double_fill); |
| 1877 int max_double_unaligned_fill = Heap::GetMaximumFillToAlign(kDoubleUnaligned); | 1876 int max_double_unaligned_fill = Heap::GetMaximumFillToAlign(kDoubleUnaligned); |
| 1878 CHECK_EQ(maximum_double_misalignment, max_double_unaligned_fill); | 1877 CHECK_EQ(maximum_double_misalignment, max_double_unaligned_fill); |
| 1879 int max_simd128_unaligned_fill = | |
| 1880 Heap::GetMaximumFillToAlign(kSimd128Unaligned); | |
| 1881 CHECK_EQ(maximum_simd128_misalignment, max_simd128_unaligned_fill); | |
| 1882 | 1878 |
| 1883 Address base = static_cast<Address>(NULL); | 1879 Address base = static_cast<Address>(NULL); |
| 1884 int fill = 0; | 1880 int fill = 0; |
| 1885 | 1881 |
| 1886 // Word alignment never requires fill. | 1882 // Word alignment never requires fill. |
| 1887 fill = Heap::GetFillToAlign(base, kWordAligned); | 1883 fill = Heap::GetFillToAlign(base, kWordAligned); |
| 1888 CHECK_EQ(0, fill); | 1884 CHECK_EQ(0, fill); |
| 1889 fill = Heap::GetFillToAlign(base + kPointerSize, kWordAligned); | 1885 fill = Heap::GetFillToAlign(base + kPointerSize, kWordAligned); |
| 1890 CHECK_EQ(0, fill); | 1886 CHECK_EQ(0, fill); |
| 1891 | 1887 |
| 1892 // No fill is required when address is double aligned. | 1888 // No fill is required when address is double aligned. |
| 1893 fill = Heap::GetFillToAlign(base, kDoubleAligned); | 1889 fill = Heap::GetFillToAlign(base, kDoubleAligned); |
| 1894 CHECK_EQ(0, fill); | 1890 CHECK_EQ(0, fill); |
| 1895 // Fill is required if address is not double aligned. | 1891 // Fill is required if address is not double aligned. |
| 1896 fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleAligned); | 1892 fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleAligned); |
| 1897 CHECK_EQ(maximum_double_misalignment, fill); | 1893 CHECK_EQ(maximum_double_misalignment, fill); |
| 1898 // kDoubleUnaligned has the opposite fill amounts. | 1894 // kDoubleUnaligned has the opposite fill amounts. |
| 1899 fill = Heap::GetFillToAlign(base, kDoubleUnaligned); | 1895 fill = Heap::GetFillToAlign(base, kDoubleUnaligned); |
| 1900 CHECK_EQ(maximum_double_misalignment, fill); | 1896 CHECK_EQ(maximum_double_misalignment, fill); |
| 1901 fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleUnaligned); | 1897 fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleUnaligned); |
| 1902 CHECK_EQ(0, fill); | 1898 CHECK_EQ(0, fill); |
| 1903 | |
| 1904 // 128 bit SIMD types have 2 or 4 possible alignments, depending on platform. | |
| 1905 fill = Heap::GetFillToAlign(base, kSimd128Unaligned); | |
| 1906 CHECK_EQ((3 * kPointerSize) & kSimd128AlignmentMask, fill); | |
| 1907 fill = Heap::GetFillToAlign(base + kPointerSize, kSimd128Unaligned); | |
| 1908 CHECK_EQ((2 * kPointerSize) & kSimd128AlignmentMask, fill); | |
| 1909 fill = Heap::GetFillToAlign(base + 2 * kPointerSize, kSimd128Unaligned); | |
| 1910 CHECK_EQ(kPointerSize, fill); | |
| 1911 fill = Heap::GetFillToAlign(base + 3 * kPointerSize, kSimd128Unaligned); | |
| 1912 CHECK_EQ(0, fill); | |
| 1913 } | 1899 } |
| 1914 | 1900 |
| 1915 | 1901 |
| 1916 static HeapObject* NewSpaceAllocateAligned(int size, | 1902 static HeapObject* NewSpaceAllocateAligned(int size, |
| 1917 AllocationAlignment alignment) { | 1903 AllocationAlignment alignment) { |
| 1918 Heap* heap = CcTest::heap(); | 1904 Heap* heap = CcTest::heap(); |
| 1919 AllocationResult allocation = | 1905 AllocationResult allocation = |
| 1920 heap->new_space()->AllocateRawAligned(size, alignment); | 1906 heap->new_space()->AllocateRawAligned(size, alignment); |
| 1921 HeapObject* obj = NULL; | 1907 HeapObject* obj = NULL; |
| 1922 allocation.To(&obj); | 1908 allocation.To(&obj); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 CHECK_EQ(kPointerSize, *top_addr - start); | 1956 CHECK_EQ(kPointerSize, *top_addr - start); |
| 1971 start = AlignNewSpace(kDoubleUnaligned, kPointerSize); | 1957 start = AlignNewSpace(kDoubleUnaligned, kPointerSize); |
| 1972 obj = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); | 1958 obj = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
| 1973 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); | 1959 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); |
| 1974 // There is a filler object before the object. | 1960 // There is a filler object before the object. |
| 1975 filler = HeapObject::FromAddress(start); | 1961 filler = HeapObject::FromAddress(start); |
| 1976 CHECK(obj != filler && filler->IsFiller() && | 1962 CHECK(obj != filler && filler->IsFiller() && |
| 1977 filler->Size() == kPointerSize); | 1963 filler->Size() == kPointerSize); |
| 1978 CHECK_EQ(kPointerSize + double_misalignment, *top_addr - start); | 1964 CHECK_EQ(kPointerSize + double_misalignment, *top_addr - start); |
| 1979 } | 1965 } |
| 1980 | |
| 1981 // Now test SIMD alignment. There are 2 or 4 possible alignments, depending | |
| 1982 // on platform. | |
| 1983 start = AlignNewSpace(kSimd128Unaligned, 0); | |
| 1984 obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 1985 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 1986 // There is no filler. | |
| 1987 CHECK_EQ(kPointerSize, *top_addr - start); | |
| 1988 start = AlignNewSpace(kSimd128Unaligned, kPointerSize); | |
| 1989 obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 1990 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 1991 // There is a filler object before the object. | |
| 1992 filler = HeapObject::FromAddress(start); | |
| 1993 CHECK(obj != filler && filler->IsFiller() && | |
| 1994 filler->Size() == kSimd128Size - kPointerSize); | |
| 1995 CHECK_EQ(kPointerSize + kSimd128Size - kPointerSize, *top_addr - start); | |
| 1996 | |
| 1997 if (double_misalignment) { | |
| 1998 // Test the 2 other alignments possible on 32 bit platforms. | |
| 1999 start = AlignNewSpace(kSimd128Unaligned, 2 * kPointerSize); | |
| 2000 obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2001 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2002 // There is a filler object before the object. | |
| 2003 filler = HeapObject::FromAddress(start); | |
| 2004 CHECK(obj != filler && filler->IsFiller() && | |
| 2005 filler->Size() == 2 * kPointerSize); | |
| 2006 CHECK_EQ(kPointerSize + 2 * kPointerSize, *top_addr - start); | |
| 2007 start = AlignNewSpace(kSimd128Unaligned, 3 * kPointerSize); | |
| 2008 obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2009 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2010 // There is a filler object before the object. | |
| 2011 filler = HeapObject::FromAddress(start); | |
| 2012 CHECK(obj != filler && filler->IsFiller() && | |
| 2013 filler->Size() == kPointerSize); | |
| 2014 CHECK_EQ(kPointerSize + kPointerSize, *top_addr - start); | |
| 2015 } | |
| 2016 } | 1966 } |
| 2017 | 1967 |
| 2018 | 1968 |
| 2019 static HeapObject* OldSpaceAllocateAligned(int size, | 1969 static HeapObject* OldSpaceAllocateAligned(int size, |
| 2020 AllocationAlignment alignment) { | 1970 AllocationAlignment alignment) { |
| 2021 Heap* heap = CcTest::heap(); | 1971 Heap* heap = CcTest::heap(); |
| 2022 AllocationResult allocation = | 1972 AllocationResult allocation = |
| 2023 heap->old_space()->AllocateRawAligned(size, alignment); | 1973 heap->old_space()->AllocateRawAligned(size, alignment); |
| 2024 HeapObject* obj = NULL; | 1974 HeapObject* obj = NULL; |
| 2025 allocation.To(&obj); | 1975 allocation.To(&obj); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2054 AllocationResult dummy = | 2004 AllocationResult dummy = |
| 2055 heap->old_space()->AllocateRawUnaligned(kPointerSize); | 2005 heap->old_space()->AllocateRawUnaligned(kPointerSize); |
| 2056 CHECK(!dummy.IsRetry()); | 2006 CHECK(!dummy.IsRetry()); |
| 2057 heap->CreateFillerObjectAt(dummy.ToObjectChecked()->address(), kPointerSize, | 2007 heap->CreateFillerObjectAt(dummy.ToObjectChecked()->address(), kPointerSize, |
| 2058 ClearRecordedSlots::kNo); | 2008 ClearRecordedSlots::kNo); |
| 2059 | 2009 |
| 2060 // Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones. | 2010 // Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones. |
| 2061 const intptr_t double_misalignment = kDoubleSize - kPointerSize; | 2011 const intptr_t double_misalignment = kDoubleSize - kPointerSize; |
| 2062 Address start; | 2012 Address start; |
| 2063 HeapObject* obj; | 2013 HeapObject* obj; |
| 2064 HeapObject* filler1; | 2014 HeapObject* filler; |
| 2065 HeapObject* filler2; | |
| 2066 if (double_misalignment) { | 2015 if (double_misalignment) { |
| 2067 start = AlignOldSpace(kDoubleAligned, 0); | 2016 start = AlignOldSpace(kDoubleAligned, 0); |
| 2068 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); | 2017 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
| 2069 // The object is aligned, and a filler object is created after. | 2018 // The object is aligned, and a filler object is created after. |
| 2070 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment)); | 2019 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment)); |
| 2071 filler1 = HeapObject::FromAddress(start + kPointerSize); | 2020 filler = HeapObject::FromAddress(start + kPointerSize); |
| 2072 CHECK(obj != filler1 && filler1->IsFiller() && | 2021 CHECK(obj != filler && filler->IsFiller() && |
| 2073 filler1->Size() == kPointerSize); | 2022 filler->Size() == kPointerSize); |
| 2074 // Try the opposite alignment case. | 2023 // Try the opposite alignment case. |
| 2075 start = AlignOldSpace(kDoubleAligned, kPointerSize); | 2024 start = AlignOldSpace(kDoubleAligned, kPointerSize); |
| 2076 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); | 2025 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned); |
| 2077 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment)); | 2026 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment)); |
| 2078 filler1 = HeapObject::FromAddress(start); | 2027 filler = HeapObject::FromAddress(start); |
| 2079 CHECK(obj != filler1); | 2028 CHECK(obj != filler); |
| 2080 CHECK(filler1->IsFiller()); | 2029 CHECK(filler->IsFiller()); |
| 2081 CHECK(filler1->Size() == kPointerSize); | 2030 CHECK(filler->Size() == kPointerSize); |
| 2082 CHECK(obj != filler1 && filler1->IsFiller() && | 2031 CHECK(obj != filler && filler->IsFiller() && |
| 2083 filler1->Size() == kPointerSize); | 2032 filler->Size() == kPointerSize); |
| 2084 | 2033 |
| 2085 // Similarly for kDoubleUnaligned. | 2034 // Similarly for kDoubleUnaligned. |
| 2086 start = AlignOldSpace(kDoubleUnaligned, 0); | 2035 start = AlignOldSpace(kDoubleUnaligned, 0); |
| 2087 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); | 2036 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
| 2088 // The object is aligned, and a filler object is created after. | 2037 // The object is aligned, and a filler object is created after. |
| 2089 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); | 2038 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); |
| 2090 filler1 = HeapObject::FromAddress(start + kPointerSize); | 2039 filler = HeapObject::FromAddress(start + kPointerSize); |
| 2091 CHECK(obj != filler1 && filler1->IsFiller() && | 2040 CHECK(obj != filler && filler->IsFiller() && |
| 2092 filler1->Size() == kPointerSize); | 2041 filler->Size() == kPointerSize); |
| 2093 // Try the opposite alignment case. | 2042 // Try the opposite alignment case. |
| 2094 start = AlignOldSpace(kDoubleUnaligned, kPointerSize); | 2043 start = AlignOldSpace(kDoubleUnaligned, kPointerSize); |
| 2095 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); | 2044 obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned); |
| 2096 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); | 2045 CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize)); |
| 2097 filler1 = HeapObject::FromAddress(start); | 2046 filler = HeapObject::FromAddress(start); |
| 2098 CHECK(obj != filler1 && filler1->IsFiller() && | 2047 CHECK(obj != filler && filler->IsFiller() && |
| 2099 filler1->Size() == kPointerSize); | 2048 filler->Size() == kPointerSize); |
| 2100 } | |
| 2101 | |
| 2102 // Now test SIMD alignment. There are 2 or 4 possible alignments, depending | |
| 2103 // on platform. | |
| 2104 start = AlignOldSpace(kSimd128Unaligned, 0); | |
| 2105 obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2106 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2107 // There is a filler object after the object. | |
| 2108 filler1 = HeapObject::FromAddress(start + kPointerSize); | |
| 2109 CHECK(obj != filler1 && filler1->IsFiller() && | |
| 2110 filler1->Size() == kSimd128Size - kPointerSize); | |
| 2111 start = AlignOldSpace(kSimd128Unaligned, kPointerSize); | |
| 2112 obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2113 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2114 // There is a filler object before the object. | |
| 2115 filler1 = HeapObject::FromAddress(start); | |
| 2116 CHECK(obj != filler1 && filler1->IsFiller() && | |
| 2117 filler1->Size() == kSimd128Size - kPointerSize); | |
| 2118 | |
| 2119 if (double_misalignment) { | |
| 2120 // Test the 2 other alignments possible on 32 bit platforms. | |
| 2121 start = AlignOldSpace(kSimd128Unaligned, 2 * kPointerSize); | |
| 2122 obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2123 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2124 // There are filler objects before and after the object. | |
| 2125 filler1 = HeapObject::FromAddress(start); | |
| 2126 CHECK(obj != filler1 && filler1->IsFiller() && | |
| 2127 filler1->Size() == 2 * kPointerSize); | |
| 2128 filler2 = HeapObject::FromAddress(start + 3 * kPointerSize); | |
| 2129 CHECK(obj != filler2 && filler2->IsFiller() && | |
| 2130 filler2->Size() == kPointerSize); | |
| 2131 start = AlignOldSpace(kSimd128Unaligned, 3 * kPointerSize); | |
| 2132 obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned); | |
| 2133 CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize)); | |
| 2134 // There are filler objects before and after the object. | |
| 2135 filler1 = HeapObject::FromAddress(start); | |
| 2136 CHECK(obj != filler1 && filler1->IsFiller() && | |
| 2137 filler1->Size() == kPointerSize); | |
| 2138 filler2 = HeapObject::FromAddress(start + 2 * kPointerSize); | |
| 2139 CHECK(obj != filler2 && filler2->IsFiller() && | |
| 2140 filler2->Size() == 2 * kPointerSize); | |
| 2141 } | 2049 } |
| 2142 } | 2050 } |
| 2143 | 2051 |
| 2144 | 2052 |
| 2145 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { | 2053 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { |
| 2146 CcTest::InitializeVM(); | 2054 CcTest::InitializeVM(); |
| 2147 HeapIterator iterator(CcTest::heap()); | 2055 HeapIterator iterator(CcTest::heap()); |
| 2148 intptr_t size_of_objects_1 = CcTest::heap()->SizeOfObjects(); | 2056 intptr_t size_of_objects_1 = CcTest::heap()->SizeOfObjects(); |
| 2149 intptr_t size_of_objects_2 = 0; | 2057 intptr_t size_of_objects_2 = 0; |
| 2150 for (HeapObject* obj = iterator.next(); | 2058 for (HeapObject* obj = iterator.next(); |
| (...skipping 4588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6739 CHECK(!heap->code_space()->FirstPage()->Contains(code->address())); | 6647 CHECK(!heap->code_space()->FirstPage()->Contains(code->address())); |
| 6740 | 6648 |
| 6741 // Ensure it's not in large object space. | 6649 // Ensure it's not in large object space. |
| 6742 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address()); | 6650 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address()); |
| 6743 CHECK(chunk->owner()->identity() != LO_SPACE); | 6651 CHECK(chunk->owner()->identity() != LO_SPACE); |
| 6744 CHECK(chunk->NeverEvacuate()); | 6652 CHECK(chunk->NeverEvacuate()); |
| 6745 } | 6653 } |
| 6746 | 6654 |
| 6747 } // namespace internal | 6655 } // namespace internal |
| 6748 } // namespace v8 | 6656 } // namespace v8 |
| OLD | NEW |