diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2018-04-10 16:53:46 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-04-11 05:55:24 +0000 |
commit | e185d303839f2a8bb0e5769ba465b971ae354bd5 (patch) | |
tree | c7802821c6a9fdfb92c357ac6d5bc79d7e94eaef /src | |
parent | 73a34bf8319178f2761811240e7c885849f272e9 (diff) |
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 <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
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<JSC::MacroAssemblerX86> 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); |