re PR libffi/52221 ([libffi] r183675,r184021 needs to be fixed.)
PR libffi/52221 * src/x86/ffi.c (ffi_closure_raw_THISCALL): New prototype. (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for thiscall-convention. (ffi_raw_call): Use ffi_prep_args_raw. * src/x86/win32.S (ffi_closure_raw_THISCALL): Add implementation for stub. From-SVN: r184526
This commit is contained in:
parent
0253a8b165
commit
ffc81ae2c8
|
@ -1,3 +1,14 @@
|
||||||
|
2012-02-22 Kai Tietz <ktietz@redhat.com>
|
||||||
|
|
||||||
|
PR libffi/52221
|
||||||
|
* src/x86/ffi.c (ffi_closure_raw_THISCALL): New
|
||||||
|
prototype.
|
||||||
|
(ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for
|
||||||
|
thiscall-convention.
|
||||||
|
(ffi_raw_call): Use ffi_prep_args_raw.
|
||||||
|
* src/x86/win32.S (ffi_closure_raw_THISCALL): Add
|
||||||
|
implementation for stub.
|
||||||
|
|
||||||
2012-02-13 Kai Tietz <ktietz@redhat.com>
|
2012-02-13 Kai Tietz <ktietz@redhat.com>
|
||||||
|
|
||||||
PR libffi/52221
|
PR libffi/52221
|
||||||
|
|
|
@ -447,6 +447,8 @@ unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
|
||||||
void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
|
void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
|
||||||
__attribute__ ((regparm(1)));
|
__attribute__ ((regparm(1)));
|
||||||
#ifdef X86_WIN32
|
#ifdef X86_WIN32
|
||||||
|
void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *)
|
||||||
|
__attribute__ ((regparm(1)));
|
||||||
void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
|
void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
|
||||||
__attribute__ ((regparm(1)));
|
__attribute__ ((regparm(1)));
|
||||||
void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *)
|
void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *)
|
||||||
|
@ -747,7 +749,7 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
|
||||||
}
|
}
|
||||||
else if (cif->abi == FFI_THISCALL)
|
else if (cif->abi == FFI_THISCALL)
|
||||||
{
|
{
|
||||||
FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_SYSV,
|
FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL,
|
||||||
codeloc, cif->bytes);
|
codeloc, cif->bytes);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -795,7 +797,7 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
|
||||||
#ifdef X86_WIN32
|
#ifdef X86_WIN32
|
||||||
case FFI_SYSV:
|
case FFI_SYSV:
|
||||||
case FFI_STDCALL:
|
case FFI_STDCALL:
|
||||||
ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags,
|
ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags,
|
||||||
ecif.rvalue, fn);
|
ecif.rvalue, fn);
|
||||||
break;
|
break;
|
||||||
case FFI_THISCALL:
|
case FFI_THISCALL:
|
||||||
|
@ -823,7 +825,7 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
|
||||||
cif->abi = abi = FFI_THISCALL;
|
cif->abi = abi = FFI_THISCALL;
|
||||||
if (passed_regs < 1 && abi == FFI_THISCALL)
|
if (passed_regs < 1 && abi == FFI_THISCALL)
|
||||||
cif->abi = abi = FFI_STDCALL;
|
cif->abi = abi = FFI_STDCALL;
|
||||||
ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags,
|
ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags,
|
||||||
ecif.rvalue, fn);
|
ecif.rvalue, fn);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -264,6 +264,18 @@ ffi_closure_SYSV ENDP
|
||||||
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
|
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
|
||||||
#define CIF_FLAGS_OFFSET 20
|
#define CIF_FLAGS_OFFSET 20
|
||||||
|
|
||||||
|
ffi_closure_raw_THISCALL PROC NEAR
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
push esi
|
||||||
|
sub esp, 36
|
||||||
|
mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif
|
||||||
|
mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
|
||||||
|
mov [esp + 12], edx
|
||||||
|
lea edx, [ebp + 12], edx
|
||||||
|
jmp stubraw
|
||||||
|
ffi_closure_raw_SYSV ENDP
|
||||||
|
|
||||||
ffi_closure_raw_SYSV PROC NEAR USES esi
|
ffi_closure_raw_SYSV PROC NEAR USES esi
|
||||||
;; the ffi_closure ctx is passed in eax by the trampoline.
|
;; the ffi_closure ctx is passed in eax by the trampoline.
|
||||||
|
|
||||||
|
@ -272,6 +284,7 @@ ffi_closure_raw_SYSV PROC NEAR USES esi
|
||||||
mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
|
mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
|
||||||
mov [esp + 12], edx ;; user_data
|
mov [esp + 12], edx ;; user_data
|
||||||
lea edx, [ebp + 8]
|
lea edx, [ebp + 8]
|
||||||
|
stubraw:
|
||||||
mov [esp + 8], edx ;; raw_args
|
mov [esp + 8], edx ;; raw_args
|
||||||
lea edx, [ebp - 24]
|
lea edx, [ebp - 24]
|
||||||
mov [esp + 4], edx ;; &res
|
mov [esp + 4], edx ;; &res
|
||||||
|
@ -722,7 +735,21 @@ _ffi_closure_SYSV:
|
||||||
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
|
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
|
||||||
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
|
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
|
||||||
#define CIF_FLAGS_OFFSET 20
|
#define CIF_FLAGS_OFFSET 20
|
||||||
|
.balign 16
|
||||||
|
.globl _ffi_closure_raw_THISCALL
|
||||||
|
#ifndef __OS2__
|
||||||
|
.def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef
|
||||||
|
#endif
|
||||||
|
_ffi_closure_raw_THISCALL:
|
||||||
|
pushl %ebp
|
||||||
|
movl %esp, %ebp
|
||||||
|
pushl %esi
|
||||||
|
subl $36, %esp
|
||||||
|
movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
|
||||||
|
movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
|
||||||
|
movl %edx, 12(%esp) /* user_data */
|
||||||
|
leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */
|
||||||
|
jmp .stubraw
|
||||||
# This assumes we are using gas.
|
# This assumes we are using gas.
|
||||||
.balign 16
|
.balign 16
|
||||||
.globl _ffi_closure_raw_SYSV
|
.globl _ffi_closure_raw_SYSV
|
||||||
|
@ -742,6 +769,7 @@ _ffi_closure_raw_SYSV:
|
||||||
movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
|
movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
|
||||||
movl %edx, 12(%esp) /* user_data */
|
movl %edx, 12(%esp) /* user_data */
|
||||||
leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
|
leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
|
||||||
|
.stubraw:
|
||||||
movl %edx, 8(%esp) /* raw_args */
|
movl %edx, 8(%esp) /* raw_args */
|
||||||
leal -24(%ebp), %edx
|
leal -24(%ebp), %edx
|
||||||
movl %edx, 4(%esp) /* &res */
|
movl %edx, 4(%esp) /* &res */
|
||||||
|
|
Loading…
Reference in New Issue