From e185d303839f2a8bb0e5769ba465b971ae354bd5 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 10 Apr 2018 16:53:46 +0200 Subject: Fix crash with JIT on x86 The stack must be 16-byte aligned in order for compiler generated alignment requiring SSE instructions to work on the stack. For x86 the stack upon entry is 4 bytes off due to the saved eip. Then another 20 bytes for the saved registers (ebp, eax, ebx, etc.). That means we have to add another 8 bytes to reach the next 16-byte alignment. Change-Id: Ifde49a89224a129f8307fff3713563b80772cff1 Task-number: QTBUG-66773 Reviewed-by: Lars Knoll --- src/qml/jit/qv4assembler.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 72b057b2bc..c3e16c4093 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -276,12 +276,16 @@ struct PlatformAssembler_X86_All : JSC::MacroAssembler push(JSStackFrameRegister); push(CppStackFrameRegister); push(EngineRegister); + // Ensure the stack is 16-byte aligned in order for compiler generated aligned SSE2 + // instructions to be able to target the stack. + subPtr(TrustedImm32(8), StackPointerRegister); loadPtr(Address(FramePointerRegister, 2 * PointerSize), CppStackFrameRegister); loadPtr(Address(FramePointerRegister, 3 * PointerSize), EngineRegister); } void generatePlatformFunctionExit() { + addPtr(TrustedImm32(8), StackPointerRegister); pop(EngineRegister); pop(CppStackFrameRegister); pop(JSStackFrameRegister); -- cgit v1.2.3