[MIPS] Ensure correct buffer alignment for doubles.
For mips, doubles and objects containing them must be aligned
to 8 bytes. This fixes up the LinearAllocator, so that the
graphics context recording storage is properly aligned.
This fixes a browser startup crash in Recording::draw()
for concatCTM(), as AffineTransform contains an array of
doubles.
Change-Id: I8c06d0f4ed38d6ff0aad06d77016e55d57bb39b9
diff --git a/Source/WebCore/platform/graphics/android/utils/LinearAllocator.cpp b/Source/WebCore/platform/graphics/android/utils/LinearAllocator.cpp
index b945944..636c30c 100644
--- a/Source/WebCore/platform/graphics/android/utils/LinearAllocator.cpp
+++ b/Source/WebCore/platform/graphics/android/utils/LinearAllocator.cpp
@@ -44,7 +44,14 @@
// Must be smaller than INITIAL_PAGE_SIZE
#define MAX_WASTE_SIZE ((size_t)1024)
-#define ALIGN(x) (x + (x % sizeof(int)))
+#if CPU(MIPS)
+#define ALIGN_SZ (sizeof(double))
+#else
+#define ALIGN_SZ (sizeof(int))
+#endif
+
+#define ALIGN(x) ((x + ALIGN_SZ - 1 ) & ~(ALIGN_SZ - 1))
+#define ALIGN_PTR(p) ((void*)(ALIGN((unsigned int)p)))
#if LOG_NDEBUG
#define ADD_ALLOCATION(size)
@@ -123,7 +130,7 @@
void* LinearAllocator::start(Page* p)
{
- return ((char*)p) + sizeof(Page);
+ return ALIGN_PTR(((char*)p) + sizeof(Page));
}
void* LinearAllocator::end(Page* p)
@@ -178,6 +185,7 @@
void LinearAllocator::rewindIfLastAlloc(void* ptr, size_t allocSize)
{
// Don't bother rewinding across pages
+ allocSize = ALIGN(allocSize);
if (ptr >= start(m_currentPage) && ptr < end(m_currentPage)
&& ptr == ((char*)m_next - allocSize)) {
m_totalAllocated -= allocSize;
@@ -188,7 +196,7 @@
LinearAllocator::Page* LinearAllocator::newPage(size_t pageSize)
{
- pageSize += sizeof(LinearAllocator::Page);
+ pageSize = ALIGN(pageSize + sizeof(LinearAllocator::Page));
ADD_ALLOCATION(pageSize);
m_totalAllocated += pageSize;
m_pageCount++;