From: Ole André Vadla Ravnås Date: Wed, 24 Mar 2021 11:16:12 +0000 (+0100) Subject: x86: Fix thiscall and fastcall stack cleanup behavior (#611) X-Git-Tag: upstream/3.4.2~39 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1aeb26714ec30649f5d9de5b4884a4ac46f5f474;p=platform%2Fupstream%2Flibffi.git x86: Fix thiscall and fastcall stack cleanup behavior (#611) These are meant to use callee clean-up. --- diff --git a/src/x86/ffi.c b/src/x86/ffi.c index 26dbc05..24431c1 100644 --- a/src/x86/ffi.c +++ b/src/x86/ffi.c @@ -538,10 +538,17 @@ ffi_closure_inner (struct closure_frame *frame, char *stack) frame->fun (cif, rvalue, avalue, frame->user_data); - if (cabi == FFI_STDCALL) - return flags + (cif->bytes << X86_RET_POP_SHIFT); - else - return flags; + switch (cabi) + { + case FFI_STDCALL: + return flags | (cif->bytes << X86_RET_POP_SHIFT); + case FFI_THISCALL: + case FFI_FASTCALL: + return flags | ((cif->bytes - (narg_reg * FFI_SIZEOF_ARG)) + << X86_RET_POP_SHIFT); + default: + return flags; + } } ffi_status @@ -558,12 +565,12 @@ ffi_prep_closure_loc (ffi_closure* closure, switch (cif->abi) { case FFI_SYSV: - case FFI_THISCALL: - case FFI_FASTCALL: case FFI_MS_CDECL: dest = ffi_closure_i386; break; case FFI_STDCALL: + case FFI_THISCALL: + case FFI_FASTCALL: case FFI_PASCAL: dest = ffi_closure_STDCALL; break;