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 {