]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
win32.S (_ffi_closure_STDCALL): New function.
authorDave Korn <dave.korn.cygwin@gmail.com>
Fri, 22 May 2009 17:58:45 +0000 (17:58 +0000)
committerDave Korn <davek@gcc.gnu.org>
Fri, 22 May 2009 17:58:45 +0000 (17:58 +0000)
* src/x86/win32.S (_ffi_closure_STDCALL):  New function.
(.eh_frame):  Add FDE for it.

From-SVN: r147802

libffi/ChangeLog
libffi/src/x86/win32.S

index 9045900105a822c4e4235bcf0335b55be6f9bfb4..d4da6b37025afd1c1000e792707fdf1b1154b16c 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-22  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       * src/x86/win32.S (_ffi_closure_STDCALL):  New function.
+       (.eh_frame):  Add FDE for it.
+
 2009-05-22  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * configure.ac:  Also check if assembler supports pc-relative
index a54c23538bfa2e985cab3ea6d05ed9a5dbea14e1..fa480ef95690c6d40f8953ab1792200d15fa1464 100644 (file)
@@ -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: