2010-12-03 Oliver Hunt <oliver@apple.com>
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Dec 2010 02:05:56 +0000 (02:05 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 4 Dec 2010 02:05:56 +0000 (02:05 +0000)
        Reviewed by Geoff Garen.

        Incorrect logic for returning memory at the end of linking.
        Reviewed by Geoff Garen.

        At the end of linking we return any space at the end of the
        allocated executable region that was saved due to branch
        compaction.  This is currently by done by subtracting the
        different from the m_freePtr in the allocation pool.  This
        can be incorrect if your allocation was made from a new
        page that was not selected for subsequent allocations.

        This patch corrects this behaviour by verifying that the
        memory being returned actually comes from the current
        allocation pool.

        * assembler/LinkBuffer.h:
        (JSC::LinkBuffer::linkCode):
        * jit/ExecutableAllocator.h:
        (JSC::ExecutablePool::tryShrink):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@73321 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/assembler/LinkBuffer.h
JavaScriptCore/jit/ExecutableAllocator.h

index 9b804bd..e314643 100644 (file)
@@ -1,3 +1,26 @@
+2010-12-03  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Geoff Garen.
+
+        Incorrect logic for returning memory at the end of linking.
+        Reviewed by Geoff Garen.
+
+        At the end of linking we return any space at the end of the
+        allocated executable region that was saved due to branch
+        compaction.  This is currently by done by subtracting the
+        different from the m_freePtr in the allocation pool.  This
+        can be incorrect if your allocation was made from a new
+        page that was not selected for subsequent allocations.
+
+        This patch corrects this behaviour by verifying that the
+        memory being returned actually comes from the current
+        allocation pool.
+
+        * assembler/LinkBuffer.h:
+        (JSC::LinkBuffer::linkCode):
+        * jit/ExecutableAllocator.h:
+        (JSC::ExecutablePool::tryShrink):
+
 2010-12-03  Michael Saboff  <msaboff@apple.com>
 
         Reviewed by Gavin Barraclough
index e1dca0b..e38b9d4 100644 (file)
@@ -265,7 +265,7 @@ private:
 
         jumpsToLink.clear();
         m_size = writePtr + m_assembler->size() - readPtr;
-        m_executablePool->returnLastBytes(initialSize - m_size);
+        m_executablePool->tryShrink(m_code, initialSize, m_size);
 
 #if DUMP_LINK_STATISTICS
         dumpLinkStatistics(m_code, initialSize, m_size);
index f362605..be20c73 100644 (file)
@@ -137,9 +137,11 @@ public:
         return poolAllocate(n);
     }
     
-    void returnLastBytes(size_t count)
+    void tryShrink(void* allocation, size_t oldSize, size_t newSize)
     {
-        m_freePtr -= count;
+        if (static_cast<char*>(allocation) + oldSize != m_freePtr)
+            return;
+        m_freePtr = static_cast<char*>(allocation) + roundUpAllocationSize(newSize, sizeof(void*));
     }
 
     ~ExecutablePool()