Fix stack alignment issue on ia32 (#1934)

The stack of Unix-like (GCC) system should be aligned on 16-byte boundary
according to the x86-32 ABI specification.
This commit is contained in:
Enrico Loparco 2023-02-06 02:07:00 +01:00 committed by GitHub
parent c3e9b66b2a
commit 42ced88424
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -16,9 +16,14 @@ _invokeNative:
push %ebp push %ebp
movl %esp, %ebp movl %esp, %ebp
movl 16(%ebp), %ecx /* ecx = argc */ movl 16(%ebp), %ecx /* ecx = argc */
movl 12(%ebp), %edx /* edx = argv */ leal 2(%ecx), %edx /* edx = ecx + 2 (count return address and saved ebp) */
andl $3, %edx /* edx = edx % 4 */
jz stack_aligned /* if edx == 0, stack is already 16 bytes aligned */
leal -16(%esp, %edx, 4), %esp /* esp = esp - 16 + edx * 4 */
stack_aligned:
test %ecx, %ecx test %ecx, %ecx
jz skip_push_args /* if ecx == 0, skip pushing arguments */ jz skip_push_args /* if ecx == 0, skip pushing arguments */
movl 12(%ebp), %edx /* edx = argv */
leal -4(%edx,%ecx,4), %edx /* edx = edx + ecx * 4 - 4 */ leal -4(%edx,%ecx,4), %edx /* edx = edx + ecx * 4 - 4 */
subl %esp, %edx /* edx = edx - esp */ subl %esp, %edx /* edx = edx - esp */
1: 1: