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)