Title: [157690] trunk/Source/_javascript_Core
Revision
157690
Author
[email protected]
Date
2013-10-19 19:07:39 -0700 (Sat, 19 Oct 2013)

Log Message

Restructure LinkBuffer to allow for alternate allocation strategies
https://bugs.webkit.org/show_bug.cgi?id=123071

Reviewed by Oliver Hunt.
        
The idea is to eventually allow a LinkBuffer to place the code into an already
allocated region of memory.  That region of memory could be the nop-slide left behind
by a llvm.webkit.patchpoint.

* assembler/ARM64Assembler.h:
(JSC::ARM64Assembler::buffer):
* assembler/AssemblerBuffer.h:
* assembler/LinkBuffer.cpp:
(JSC::LinkBuffer::copyCompactAndLinkCode):
(JSC::LinkBuffer::linkCode):
(JSC::LinkBuffer::allocate):
(JSC::LinkBuffer::shrink):
* assembler/LinkBuffer.h:
(JSC::LinkBuffer::LinkBuffer):
(JSC::LinkBuffer::didFailToAllocate):
* assembler/X86Assembler.h:
(JSC::X86Assembler::buffer):
(JSC::X86Assembler::X86InstructionFormatter::memoryModRM):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (157689 => 157690)


--- trunk/Source/_javascript_Core/ChangeLog	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-10-20 02:07:39 UTC (rev 157690)
@@ -1,3 +1,29 @@
+2013-10-19  Filip Pizlo  <[email protected]>
+
+        Restructure LinkBuffer to allow for alternate allocation strategies
+        https://bugs.webkit.org/show_bug.cgi?id=123071
+
+        Reviewed by Oliver Hunt.
+        
+        The idea is to eventually allow a LinkBuffer to place the code into an already
+        allocated region of memory.  That region of memory could be the nop-slide left behind
+        by a llvm.webkit.patchpoint.
+
+        * assembler/ARM64Assembler.h:
+        (JSC::ARM64Assembler::buffer):
+        * assembler/AssemblerBuffer.h:
+        * assembler/LinkBuffer.cpp:
+        (JSC::LinkBuffer::copyCompactAndLinkCode):
+        (JSC::LinkBuffer::linkCode):
+        (JSC::LinkBuffer::allocate):
+        (JSC::LinkBuffer::shrink):
+        * assembler/LinkBuffer.h:
+        (JSC::LinkBuffer::LinkBuffer):
+        (JSC::LinkBuffer::didFailToAllocate):
+        * assembler/X86Assembler.h:
+        (JSC::X86Assembler::buffer):
+        (JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
+
 2013-10-19  Alexey Proskuryakov  <[email protected]>
 
         Some includes in JSC seem to use an incorrect style

Modified: trunk/Source/_javascript_Core/assembler/ARM64Assembler.h (157689 => 157690)


--- trunk/Source/_javascript_Core/assembler/ARM64Assembler.h	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/assembler/ARM64Assembler.h	2013-10-20 02:07:39 UTC (rev 157690)
@@ -453,6 +453,8 @@
         , m_indexOfTailOfLastWatchpoint(INT_MIN)
     {
     }
+    
+    AssemblerBuffer& buffer() { return m_buffer; }
 
     // (HS, LO, HI, LS) -> (AE, B, A, BE)
     // (VS, VC) -> (O, NO)

Modified: trunk/Source/_javascript_Core/assembler/AssemblerBuffer.h (157689 => 157690)


--- trunk/Source/_javascript_Core/assembler/AssemblerBuffer.h	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/assembler/AssemblerBuffer.h	2013-10-20 02:07:39 UTC (rev 157690)
@@ -130,23 +130,6 @@
             return AssemblerLabel(m_index);
         }
 
-        PassRefPtr<ExecutableMemoryHandle> executableCopy(VM& vm, void* ownerUID, JITCompilationEffort effort)
-        {
-            if (!m_index)
-                return 0;
-
-            RefPtr<ExecutableMemoryHandle> result = vm.executableAllocator.allocate(vm, m_index, ownerUID, effort);
-
-            if (!result)
-                return 0;
-
-            ExecutableAllocator::makeWritable(result->start(), result->sizeInBytes());
-
-            memcpy(result->start(), m_buffer, m_index);
-            
-            return result.release();
-        }
-
         unsigned debugOffset() { return m_index; }
 
     protected:

Modified: trunk/Source/_javascript_Core/assembler/LinkBuffer.cpp (157689 => 157690)


--- trunk/Source/_javascript_Core/assembler/LinkBuffer.cpp	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/assembler/LinkBuffer.cpp	2013-10-20 02:07:39 UTC (rev 157690)
@@ -64,12 +64,7 @@
 void LinkBuffer::copyCompactAndLinkCode(void* ownerUID, JITCompilationEffort effort)
 {
     m_initialSize = m_assembler->m_assembler.codeSize();
-    m_executableMemory = m_vm->executableAllocator.allocate(*m_vm, m_initialSize, ownerUID, effort);
-    if (!m_executableMemory)
-        return;
-    m_code = (uint8_t*)m_executableMemory->start();
-    ASSERT(m_code);
-    ExecutableAllocator::makeWritable(m_code, m_initialSize);
+    allocate(m_initialSize, ownerUID, effort);
     uint8_t* inData = (uint8_t*)m_assembler->unlinkedCode();
     uint8_t* outData = reinterpret_cast<uint8_t*>(m_code);
     int readPtr = 0;
@@ -125,8 +120,7 @@
     }
 
     jumpsToLink.clear();
-    m_size = writePtr + m_initialSize - readPtr;
-    m_executableMemory->shrink(m_size);
+    shrink(writePtr + m_initialSize - readPtr);
 
 #if DUMP_LINK_STATISTICS
     dumpLinkStatistics(m_code, m_initialSize, m_size);
@@ -142,12 +136,12 @@
 {
     ASSERT(!m_code);
 #if !ENABLE(BRANCH_COMPACTION)
-    m_executableMemory = m_assembler->m_assembler.executableCopy(*m_vm, ownerUID, effort);
-    if (!m_executableMemory)
+    AssemblerBuffer& buffer = m_assembler->m_assembler.buffer();
+    allocate(buffer.codeSize(), ownerUID, effort);
+    if (!m_didAllocate)
         return;
-    m_code = m_executableMemory->start();
-    m_size = m_assembler->m_assembler.codeSize();
     ASSERT(m_code);
+    memcpy(m_code, buffer.data(), buffer.codeSize());
 #elif CPU(ARM_THUMB2)
     copyCompactAndLinkCode<uint16_t>(ownerUID, effort);
 #elif CPU(ARM64)
@@ -155,6 +149,23 @@
 #endif
 }
 
+void LinkBuffer::allocate(size_t initialSize, void* ownerUID, JITCompilationEffort effort)
+{
+    m_executableMemory = m_vm->executableAllocator.allocate(*m_vm, initialSize, ownerUID, effort);
+    if (!m_executableMemory)
+        return;
+    ExecutableAllocator::makeWritable(m_executableMemory->start(), m_executableMemory->sizeInBytes());
+    m_code = m_executableMemory->start();
+    m_size = initialSize;
+    m_didAllocate = true;
+}
+
+void LinkBuffer::shrink(size_t newSize)
+{
+    m_size = newSize;
+    m_executableMemory->shrink(m_size);
+}
+
 void LinkBuffer::performFinalization()
 {
 #ifndef NDEBUG

Modified: trunk/Source/_javascript_Core/assembler/LinkBuffer.h (157689 => 157690)


--- trunk/Source/_javascript_Core/assembler/LinkBuffer.h	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/assembler/LinkBuffer.h	2013-10-20 02:07:39 UTC (rev 157690)
@@ -83,6 +83,7 @@
 #if ENABLE(BRANCH_COMPACTION)
         , m_initialSize(0)
 #endif
+        , m_didAllocate(false)
         , m_code(0)
         , m_assembler(masm)
         , m_vm(&vm)
@@ -99,7 +100,7 @@
     
     bool didFailToAllocate() const
     {
-        return !m_executableMemory;
+        return !m_didAllocate;
     }
 
     bool isValid() const
@@ -241,6 +242,9 @@
     {
         return m_code;
     }
+    
+    void allocate(size_t initialSize, void* ownerUID, JITCompilationEffort);
+    void shrink(size_t newSize);
 
     void linkCode(void* ownerUID, JITCompilationEffort);
 #if ENABLE(BRANCH_COMPACTION)
@@ -263,6 +267,7 @@
 #if ENABLE(BRANCH_COMPACTION)
     size_t m_initialSize;
 #endif
+    bool m_didAllocate;
     void* m_code;
     MacroAssembler* m_assembler;
     VM* m_vm;

Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (157689 => 157690)


--- trunk/Source/_javascript_Core/assembler/X86Assembler.h	2013-10-20 00:24:40 UTC (rev 157689)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h	2013-10-20 02:07:39 UTC (rev 157690)
@@ -333,6 +333,8 @@
         , m_indexOfTailOfLastWatchpoint(INT_MIN)
     {
     }
+    
+    AssemblerBuffer& buffer() { return m_formatter.m_buffer; }
 
     // Stack operations:
 
@@ -2122,11 +2124,6 @@
         return b.m_offset - a.m_offset;
     }
     
-    PassRefPtr<ExecutableMemoryHandle> executableCopy(VM& vm, void* ownerUID, JITCompilationEffort effort)
-    {
-        return m_formatter.executableCopy(vm, ownerUID, effort);
-    }
-
     unsigned debugOffset() { return m_formatter.debugOffset(); }
 
     void nop()
@@ -2480,11 +2477,6 @@
         bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); }
         void* data() const { return m_buffer.data(); }
 
-        PassRefPtr<ExecutableMemoryHandle> executableCopy(VM& vm, void* ownerUID, JITCompilationEffort effort)
-        {
-            return m_buffer.executableCopy(vm, ownerUID, effort);
-        }
-
         unsigned debugOffset() { return m_buffer.debugOffset(); }
 
     private:
@@ -2658,6 +2650,7 @@
         }
 #endif
 
+    public:
         AssemblerBuffer m_buffer;
     } m_formatter;
     int m_indexOfLastWatchpoint;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to