aboutsummaryrefslogtreecommitdiff
path: root/libffi/src
diff options
context:
space:
mode:
authorDave Korn <dave.korn.cygwin@gmail.com>2009-05-22 17:58:45 +0000
committerDave Korn <davek@gcc.gnu.org>2009-05-22 17:58:45 +0000
commit84c40c4a8f0b0b31f7692f89e9773f5d2cf78f5c (patch)
tree232653b4a801cf6086988d952bdd4dd3e7f0f477 /libffi/src
parent8353cd27a414d07e1ee6806c0742081f1b3ee899 (diff)
downloadgcc-84c40c4a8f0b0b31f7692f89e9773f5d2cf78f5c.zip
gcc-84c40c4a8f0b0b31f7692f89e9773f5d2cf78f5c.tar.gz
gcc-84c40c4a8f0b0b31f7692f89e9773f5d2cf78f5c.tar.bz2
win32.S (_ffi_closure_STDCALL): New function.
* src/x86/win32.S (_ffi_closure_STDCALL): New function. (.eh_frame): Add FDE for it. From-SVN: r147802
Diffstat (limited to 'libffi/src')
-rw-r--r--libffi/src/x86/win32.S95
1 files changed, 95 insertions, 0 deletions
diff --git a/libffi/src/x86/win32.S b/libffi/src/x86/win32.S
index a54c235..fa480ef 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: