Title: [161298] branches/jsCStack/Source/_javascript_Core
Revision
161298
Author
msab...@apple.com
Date
2014-01-03 16:58:11 -0800 (Fri, 03 Jan 2014)

Log Message

CStack Branch: Make emitPutToCallFrameHeaderBeforePrologue and friends work for all platforms
https://bugs.webkit.org/show_bug.cgi?id=126421

Reviewed by Filip Pizlo.

Added new helper prologueStackPointerDelta() that returns the amount the stack
pointer should be adjusted when accessing a CallFrame via the stack pointer
before the function prologue has been executed.

* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::prologueStackPointerDelta):
(JSC::AssemblyHelpers::emitFunctionEpilogue):
(JSC::AssemblyHelpers::emitPutToCallFrameHeaderBeforePrologue):
(JSC::AssemblyHelpers::emitPutPayloadToCallFrameHeaderBeforePrologue):
(JSC::AssemblyHelpers::emitPutTagToCallFrameHeaderBeforePrologue):

Modified Paths

Diff

Modified: branches/jsCStack/Source/_javascript_Core/ChangeLog (161297 => 161298)


--- branches/jsCStack/Source/_javascript_Core/ChangeLog	2014-01-04 00:52:16 UTC (rev 161297)
+++ branches/jsCStack/Source/_javascript_Core/ChangeLog	2014-01-04 00:58:11 UTC (rev 161298)
@@ -1,3 +1,21 @@
+2014-01-03  Michael Saboff  <msab...@apple.com>
+
+        CStack Branch: Make emitPutToCallFrameHeaderBeforePrologue and friends work for all platforms
+        https://bugs.webkit.org/show_bug.cgi?id=126421
+
+        Reviewed by Filip Pizlo.
+
+        Added new helper prologueStackPointerDelta() that returns the amount the stack
+        pointer should be adjusted when accessing a CallFrame via the stack pointer
+        before the function prologue has been executed.
+
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::prologueStackPointerDelta):
+        (JSC::AssemblyHelpers::emitFunctionEpilogue):
+        (JSC::AssemblyHelpers::emitPutToCallFrameHeaderBeforePrologue):
+        (JSC::AssemblyHelpers::emitPutPayloadToCallFrameHeaderBeforePrologue):
+        (JSC::AssemblyHelpers::emitPutTagToCallFrameHeaderBeforePrologue):
+
 2014-01-03  Filip Pizlo  <fpi...@apple.com>
 
         Unreviewed, some trivial 32-bit build fixes.

Modified: branches/jsCStack/Source/_javascript_Core/jit/AssemblyHelpers.h (161297 => 161298)


--- branches/jsCStack/Source/_javascript_Core/jit/AssemblyHelpers.h	2014-01-04 00:52:16 UTC (rev 161297)
+++ branches/jsCStack/Source/_javascript_Core/jit/AssemblyHelpers.h	2014-01-04 00:58:11 UTC (rev 161298)
@@ -58,8 +58,7 @@
     CodeBlock* codeBlock() { return m_codeBlock; }
     VM* vm() { return m_vm; }
     AssemblerType_T& assembler() { return m_assembler; }
-    
-#if CPU(X86_64) || CPU(X86)
+
     void checkStackPointerAlignment()
     {
 #ifndef NDEBUG
@@ -69,6 +68,13 @@
 #endif
     }
 
+#if CPU(X86_64) || CPU(X86)
+    size_t prologueStackPointerDelta()
+    {
+        // Prologue only saves the framePointerRegister
+        return sizeof(void*);
+    }
+
     void emitFunctionPrologue()
     {
         push(framePointerRegister);
@@ -77,11 +83,10 @@
 
     void emitFunctionEpilogue()
     {
-        // FIXME: The stack pointer need to be calculated from the framePointer
         move(framePointerRegister, stackPointerRegister);
         pop(framePointerRegister);
     }
-    
+
     void preserveReturnAddressAfterCall(GPRReg reg)
     {
         pop(reg);
@@ -96,32 +101,15 @@
     {
         push(address);
     }
+#endif // CPU(X86_64) || CPU(X86)
 
-    // emitPutToCallFrameHeaderBeforePrologue() and related are used to access callee frame header
-    // fields before the code from emitFunctionPrologue() has executed.
-    // First, the access is via the stack pointer. Second, the address calculation must also take
-    // into account that the stack pointer may not have been adjusted down for the return PC and/or
-    // caller's frame pointer. On some platforms, the callee is responsible for pushing the
-    // "link register" containing the return address in the function prologue.
-#if USE(JSVALUE64)
-    void emitPutToCallFrameHeaderBeforePrologue(GPRReg from, JSStack::CallFrameHeaderEntry entry)
+#if CPU(ARM) || CPU(ARM64)
+    size_t prologueStackPointerDelta()
     {
-        storePtr(from, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - sizeof(void*)));
+        // Prologue saves the framePointerRegister and linkRegister
+        return 2 * sizeof(void*);
     }
-#else
-    void emitPutPayloadToCallFrameHeaderBeforePrologue(GPRReg from, JSStack::CallFrameHeaderEntry entry)
-    {
-        storePtr(from, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - sizeof(void*) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));
-    }
 
-    void emitPutTagToCallFrameHeaderBeforePrologue(TrustedImm32 tag, JSStack::CallFrameHeaderEntry entry)
-    {
-        storePtr(tag, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - sizeof(void*) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)));
-    }
-#endif
-#endif // CPU(X86_64) || CPU(X86)
-
-#if CPU(ARM) || CPU(ARM64)
     ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)
     {
         move(linkRegister, reg);
@@ -139,6 +127,12 @@
 #endif
 
 #if CPU(MIPS)
+    size_t prologueStackPointerDelta()
+    {
+        // Prologue saves the framePointerRegister and returnAddressRegister
+        return 2 * sizeof(void*);
+    }
+
     ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)
     {
         move(returnAddressRegister, reg);
@@ -156,6 +150,12 @@
 #endif
 
 #if CPU(SH4)
+    size_t prologueStackPointerDelta()
+    {
+        // Prologue saves the framePointerRegister and link register
+        return 2 * sizeof(void*);
+    }
+
     ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)
     {
         m_assembler.stspr(reg);
@@ -208,6 +208,29 @@
         storePtr(from, Address(GPRInfo::callFrameRegister, CallFrame::returnPCOffset()));
     }
 
+    // emitPutToCallFrameHeaderBeforePrologue() and related are used to access callee frame header
+    // fields before the code from emitFunctionPrologue() has executed.
+    // First, the access is via the stack pointer. Second, the address calculation must also take
+    // into account that the stack pointer may not have been adjusted down for the return PC and/or
+    // caller's frame pointer. On some platforms, the callee is responsible for pushing the
+    // "link register" containing the return address in the function prologue.
+#if USE(JSVALUE64)
+    void emitPutToCallFrameHeaderBeforePrologue(GPRReg from, JSStack::CallFrameHeaderEntry entry)
+    {
+        storePtr(from, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - prologueStackPointerDelta()));
+    }
+#else
+    void emitPutPayloadToCallFrameHeaderBeforePrologue(GPRReg from, JSStack::CallFrameHeaderEntry entry)
+    {
+        storePtr(from, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - prologueStackPointerDelta() + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));
+    }
+
+    void emitPutTagToCallFrameHeaderBeforePrologue(TrustedImm32 tag, JSStack::CallFrameHeaderEntry entry)
+    {
+        storePtr(tag, Address(stackPointerRegister, entry * static_cast<ptrdiff_t>(sizeof(Register)) - prologueStackPointerDelta() + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)));
+    }
+#endif
+
     Jump branchIfNotCell(GPRReg reg)
     {
 #if USE(JSVALUE64)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to