REGRESSION(r157690, r157699) Fix architectures using AssemblerBufferWithConstantPool.
https://bugs.webkit.org/show_bug.cgi?id=123092

Patch by Julien Brianceau <jbriance@cisco.com> on 2013-10-22
Reviewed by Michael Saboff.

Impacted architectures are SH4 and ARM_TRADITIONAL.

* assembler/ARMAssembler.h:
(JSC::ARMAssembler::buffer):
* assembler/AssemblerBufferWithConstantPool.h:
(JSC::AssemblerBufferWithConstantPool::flushConstantPool):
* assembler/LinkBuffer.cpp:
(JSC::LinkBuffer::linkCode):
* assembler/SH4Assembler.h:
(JSC::SH4Assembler::buffer):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@157796 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index c88eb12..c676c22 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,5 +1,23 @@
 2013-10-22  Julien Brianceau  <jbriance@cisco.com>
 
+        REGRESSION(r157690, r157699) Fix architectures using AssemblerBufferWithConstantPool.
+        https://bugs.webkit.org/show_bug.cgi?id=123092
+
+        Reviewed by Michael Saboff.
+
+        Impacted architectures are SH4 and ARM_TRADITIONAL.
+
+        * assembler/ARMAssembler.h:
+        (JSC::ARMAssembler::buffer):
+        * assembler/AssemblerBufferWithConstantPool.h:
+        (JSC::AssemblerBufferWithConstantPool::flushConstantPool):
+        * assembler/LinkBuffer.cpp:
+        (JSC::LinkBuffer::linkCode):
+        * assembler/SH4Assembler.h:
+        (JSC::SH4Assembler::buffer):
+
+2013-10-22  Julien Brianceau  <jbriance@cisco.com>
+
         Remove unused stuff in JIT stubs.
         https://bugs.webkit.org/show_bug.cgi?id=123155
 
diff --git a/Source/JavaScriptCore/assembler/ARMAssembler.h b/Source/JavaScriptCore/assembler/ARMAssembler.h
index 6744789..f5f3038 100644
--- a/Source/JavaScriptCore/assembler/ARMAssembler.h
+++ b/Source/JavaScriptCore/assembler/ARMAssembler.h
@@ -151,6 +151,8 @@
         {
         }
 
+        ARMBuffer& buffer() { return m_buffer; }
+
         // ARM conditional constants
         typedef enum {
             EQ = 0x00000000, // Zero / Equal.
diff --git a/Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h b/Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h
index 6613e82..053884b 100644
--- a/Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h
+++ b/Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h
@@ -223,6 +223,41 @@
         return m_numConsts;
     }
 
+    void flushConstantPool(bool useBarrier = true)
+    {
+        if (!m_numConsts)
+            return;
+        int alignPool = (codeSize() + (useBarrier ? barrierSize : 0)) & (sizeof(uint64_t) - 1);
+
+        if (alignPool)
+            alignPool = sizeof(uint64_t) - alignPool;
+
+        // Callback to protect the constant pool from execution
+        if (useBarrier)
+            putIntegral(AssemblerType::placeConstantPoolBarrier(m_numConsts * sizeof(uint32_t) + alignPool));
+
+        if (alignPool) {
+            if (alignPool & 1)
+                AssemblerBuffer::putByte(AssemblerType::padForAlign8);
+            if (alignPool & 2)
+                AssemblerBuffer::putShort(AssemblerType::padForAlign16);
+            if (alignPool & 4)
+                AssemblerBuffer::putInt(AssemblerType::padForAlign32);
+        }
+
+        int constPoolOffset = codeSize();
+        append(reinterpret_cast<char*>(m_pool), m_numConsts * sizeof(uint32_t));
+
+        // Patch each PC relative load
+        for (LoadOffsets::Iterator iter = m_loadOffsets.begin(); iter != m_loadOffsets.end(); ++iter) {
+            void* loadAddr = reinterpret_cast<char*>(data()) + *iter;
+            AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast<char*>(data()) + constPoolOffset);
+        }
+
+        m_loadOffsets.clear();
+        m_numConsts = 0;
+    }
+
 private:
     void correctDeltas(int insnSize)
     {
@@ -267,41 +302,6 @@
         correctDeltas(sizeof(IntegralType), 4);
     }
 
-    void flushConstantPool(bool useBarrier = true)
-    {
-        if (m_numConsts == 0)
-            return;
-        int alignPool = (codeSize() + (useBarrier ? barrierSize : 0)) & (sizeof(uint64_t) - 1);
-
-        if (alignPool)
-            alignPool = sizeof(uint64_t) - alignPool;
-
-        // Callback to protect the constant pool from execution
-        if (useBarrier)
-            putIntegral(AssemblerType::placeConstantPoolBarrier(m_numConsts * sizeof(uint32_t) + alignPool));
-
-        if (alignPool) {
-            if (alignPool & 1)
-                AssemblerBuffer::putByte(AssemblerType::padForAlign8);
-            if (alignPool & 2)
-                AssemblerBuffer::putShort(AssemblerType::padForAlign16);
-            if (alignPool & 4)
-                AssemblerBuffer::putInt(AssemblerType::padForAlign32);
-        }
-
-        int constPoolOffset = codeSize();
-        append(reinterpret_cast<char*>(m_pool), m_numConsts * sizeof(uint32_t));
-
-        // Patch each PC relative load
-        for (LoadOffsets::Iterator iter = m_loadOffsets.begin(); iter != m_loadOffsets.end(); ++iter) {
-            void* loadAddr = reinterpret_cast<char*>(data()) + *iter;
-            AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast<char*>(data()) + constPoolOffset);
-        }
-
-        m_loadOffsets.clear();
-        m_numConsts = 0;
-    }
-
     void flushIfNoSpaceFor(int nextInsnSize)
     {
         if (m_numConsts == 0)
diff --git a/Source/JavaScriptCore/assembler/LinkBuffer.cpp b/Source/JavaScriptCore/assembler/LinkBuffer.cpp
index a49417e..cbaad76 100644
--- a/Source/JavaScriptCore/assembler/LinkBuffer.cpp
+++ b/Source/JavaScriptCore/assembler/LinkBuffer.cpp
@@ -136,6 +136,9 @@
 {
     ASSERT(!m_code);
 #if !ENABLE(BRANCH_COMPACTION)
+#if defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL
+    m_assembler->m_assembler.buffer().flushConstantPool(false);
+#endif
     AssemblerBuffer& buffer = m_assembler->m_assembler.buffer();
     allocate(buffer.codeSize(), ownerUID, effort);
     if (!m_didAllocate)
diff --git a/Source/JavaScriptCore/assembler/SH4Assembler.h b/Source/JavaScriptCore/assembler/SH4Assembler.h
index f3de9e4..0d81a13 100644
--- a/Source/JavaScriptCore/assembler/SH4Assembler.h
+++ b/Source/JavaScriptCore/assembler/SH4Assembler.h
@@ -349,7 +349,7 @@
     {
     }
 
-    AssemblerBuffer& buffer() { return m_buffer; }
+    SH4Buffer& buffer() { return m_buffer; }
 
     // SH4 condition codes
     typedef enum {