diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 9045900105a..d4da6b37025 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,8 @@ +2009-05-22 Dave Korn + + * src/x86/win32.S (_ffi_closure_STDCALL): New function. + (.eh_frame): Add FDE for it. + 2009-05-22 Dave Korn * configure.ac: Also check if assembler supports pc-relative diff --git a/libffi/src/x86/win32.S b/libffi/src/x86/win32.S index a54c23538bf..fa480ef9569 100644 --- a/libffi/src/x86/win32.S +++ b/libffi/src/x86/win32.S @@ -390,6 +390,70 @@ _ffi_closure_raw_SYSV: #endif /* !FFI_NO_RAW_API */ + # This assumes we are using gas. + .balign 16 + .globl _ffi_closure_STDCALL + .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef +_ffi_closure_STDCALL: +.LFB5: + pushl %ebp +.LCFI9: + movl %esp, %ebp +.LCFI10: + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 12(%ebp), %edx /* account for stub return address on stack */ + movl %edx, 4(%esp) /* args */ + leal -12(%ebp), %edx + movl %edx, (%esp) /* &resp */ + call _ffi_closure_SYSV_inner + movl -12(%ebp), %ecx + /* It would be nice to just share this code with the + duplicate sequence in _ffi_closure_SYSV, if only + there were some way to represent that in the EH info. */ + cmpl $FFI_TYPE_INT, %eax + je .Lscls_retint + cmpl $FFI_TYPE_FLOAT, %eax + je .Lscls_retfloat + cmpl $FFI_TYPE_DOUBLE, %eax + je .Lscls_retdouble + cmpl $FFI_TYPE_LONGDOUBLE, %eax + je .Lscls_retldouble + cmpl $FFI_TYPE_SINT64, %eax + je .Lscls_retllong + cmpl $FFI_TYPE_SINT8, %eax /* 1-byte struct */ + je .Lscls_retstruct1 + cmpl $FFI_TYPE_SINT16, %eax /* 2-bytes struct */ + je .Lscls_retstruct2 +.Lscls_epilogue: + movl %ebp, %esp + popl %ebp + ret +.Lscls_retint: + movl (%ecx), %eax + jmp .Lscls_epilogue +.Lscls_retfloat: + flds (%ecx) + jmp .Lscls_epilogue +.Lscls_retdouble: + fldl (%ecx) + jmp .Lscls_epilogue +.Lscls_retldouble: + fldt (%ecx) + jmp .Lscls_epilogue +.Lscls_retllong: + movl (%ecx), %eax + movl 4(%ecx), %edx + jmp .Lscls_epilogue +.Lscls_retstruct1: + movsbl (%ecx), %eax + jmp .Lscls_epilogue +.Lscls_retstruct2: + movswl (%ecx), %eax + jmp .Lscls_epilogue +.ffi_closure_STDCALL_end: +.LFE5: .section .eh_frame,"w" .Lframe1: @@ -552,3 +616,34 @@ _ffi_closure_raw_SYSV: .LEFDE4: #endif /* !FFI_NO_RAW_API */ + +.LSFDE5: + .long .LEFDE5-.LASFDE5 /* FDE Length */ +.LASFDE5: + .long .LASFDE5-.Lframe1 /* FDE CIE offset */ +#if defined __PIC__ && defined HAVE_AS_X86_PCREL + .long .LFB5-. /* FDE initial location */ +#else + .long .LFB5 +#endif + .long .LFE5-.LFB5 /* FDE address range */ +#ifdef __PIC__ + .byte 0x0 /* .uleb128 0x0; Augmentation size */ +#endif + /* DW_CFA_xxx CFI instructions go here. */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI9-.LFB5 + .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ + .byte 0x8 /* .uleb128 0x8 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ + .byte 0x2 /* .uleb128 0x2 */ + + .byte 0x4 /* DW_CFA_advance_loc4 */ + .long .LCFI10-.LCFI9 + .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ + .byte 0x5 /* .uleb128 0x5 */ + + /* End of DW_CFA_xxx CFI instructions. */ + .align 4 +.LEFDE5: