]> granicus.if.org Git - python/commitdiff
Sync with files from the just released libffi 3.0.5 version.
authorThomas Heller <theller@ctypes.org>
Fri, 4 Apr 2008 16:01:54 +0000 (16:01 +0000)
committerThomas Heller <theller@ctypes.org>
Fri, 4 Apr 2008 16:01:54 +0000 (16:01 +0000)
Modules/_ctypes/libffi/include/ffi.h.in
Modules/_ctypes/libffi/src/pa/hpux32.S [new file with mode: 0644]
Modules/_ctypes/libffi/src/x86/darwin64.S [new file with mode: 0644]
Modules/_ctypes/libffi/src/x86/ffi.c
Modules/_ctypes/libffi/src/x86/freebsd.S [new file with mode: 0644]

index 1a015ae50f19047da7c4b58e0015cbff93d60ae1..7df3b06e15d9e0a44537ae0fae15941be3bdc133 100644 (file)
@@ -57,7 +57,9 @@ extern "C" {
 #endif
 
 /* Specify which architecture libffi is configured for. */
+#ifndef @TARGET@
 #define @TARGET@
+#endif
 
 /* ---- System configuration information --------------------------------- */
 
diff --git a/Modules/_ctypes/libffi/src/pa/hpux32.S b/Modules/_ctypes/libffi/src/pa/hpux32.S
new file mode 100644 (file)
index 0000000..40528ba
--- /dev/null
@@ -0,0 +1,368 @@
+/* -----------------------------------------------------------------------
+   hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc.
+                       (c) 2008 Red Hat, Inc.
+   based on src/pa/linux.S
+
+   HP-UX PA Foreign Function Interface
+
+   Permission is hereby granted, free of charge, to any person obtaining
+   a copy of this software and associated documentation files (the
+   ``Software''), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+   OTHER DEALINGS IN THE SOFTWARE.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+       .LEVEL 1.1
+       .SPACE  $PRIVATE$
+       .IMPORT $global$,DATA
+       .IMPORT $$dyncall,MILLICODE
+       .SUBSPA $DATA$
+       .align  4
+
+       /* void ffi_call_pa32(void (*)(char *, extended_cif *),
+                              extended_cif *ecif,
+                              unsigned bytes,
+                              unsigned flags,
+                              unsigned *rvalue,
+                              void (*fn)(void));
+        */
+
+       .export ffi_call_pa32,ENTRY,PRIV_LEV=3
+       .import ffi_prep_args_pa32,CODE
+
+       .SPACE  $TEXT$
+       .SUBSPA $CODE$
+       .align  4
+
+L$FB1
+ffi_call_pa32
+       .proc
+       .callinfo       FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
+       .entry
+       stw     %rp, -20(%sp)
+       copy    %r3, %r1
+L$CFI11
+       copy    %sp, %r3
+L$CFI12
+
+       /* Setup the stack for calling prep_args...
+          We want the stack to look like this:
+
+          [ Previous stack                            ] <- %r3
+
+          [ 64-bytes register save area               ] <- %r4
+
+          [ Stack space for actual call, passed as    ] <- %arg0
+          [     arg0 to ffi_prep_args_pa32           ]
+
+          [ Stack for calling prep_args               ] <- %sp
+        */
+
+       stwm    %r1, 64(%sp)
+       stw     %r4, 12(%r3)
+L$CFI13
+       copy    %sp, %r4
+
+       addl    %arg2, %r4, %arg0       ; arg stack
+       stw     %arg3, -48(%r3)         ; save flags we need it later
+
+       /* Call prep_args:
+          %arg0(stack) -- set up above
+          %arg1(ecif)  -- same as incoming param
+          %arg2(bytes) -- same as incoming param */
+       bl      ffi_prep_args_pa32,%r2
+       ldo     64(%arg0), %sp
+       ldo     -64(%sp), %sp
+
+       /* now %sp should point where %arg0 was pointing.  */
+
+       /* Load the arguments that should be passed in registers
+          The fp args are loaded by the prep_args function.  */
+       ldw     -36(%sp), %arg0
+       ldw     -40(%sp), %arg1
+       ldw     -44(%sp), %arg2
+       ldw     -48(%sp), %arg3
+
+       /* in case the function is going to return a structure
+          we need to give it a place to put the result.  */
+       ldw     -52(%r3), %ret0         ; %ret0 <- rvalue
+       ldw     -56(%r3), %r22          ; %r22 <- function to call
+       bl      $$dyncall, %r31         ; Call the user function
+       copy    %r31, %rp
+
+       /* Prepare to store the result; we need to recover flags and rvalue.  */
+       ldw     -48(%r3), %r21          ; r21 <- flags
+       ldw     -52(%r3), %r20          ; r20 <- rvalue
+
+       /* Store the result according to the return type.  The most
+          likely types should come first.  */
+
+L$checkint
+       comib,<>,n FFI_TYPE_INT, %r21, L$checkint8
+       b       L$done
+       stw     %ret0, 0(%r20)
+
+L$checkint8
+       comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16
+       b       L$done
+       stb     %ret0, 0(%r20)
+
+L$checkint16
+       comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl
+       b       L$done
+       sth     %ret0, 0(%r20)
+
+L$checkdbl
+       comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat
+       b       L$done
+       fstd    %fr4,0(%r20)
+
+L$checkfloat
+       comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll
+       b       L$done
+       fstw    %fr4L,0(%r20)
+
+L$checkll
+       comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2
+       stw     %ret0, 0(%r20)
+       b       L$done
+       stw     %ret1, 4(%r20)
+
+L$checksmst2
+       comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3
+       /* 2-byte structs are returned in ret0 as ????xxyy.  */
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret0, 0(%r20)
+
+L$checksmst3
+       comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4
+       /* 3-byte structs are returned in ret0 as ??xxyyzz.  */
+       extru   %ret0, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret0, 0(%r20)
+
+L$checksmst4
+       comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5
+       /* 4-byte structs are returned in ret0 as wwxxyyzz.  */
+       extru   %ret0, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret0, 0(%r20)
+
+L$checksmst5
+       comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6
+       /* 5 byte values are returned right justified:
+             ret0     ret1
+          5: ??????aa bbccddee */
+       stbs,ma %ret0, 1(%r20)
+       extru   %ret1, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret1, 0(%r20)
+
+L$checksmst6
+       comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7
+       /* 6 byte values are returned right justified:
+             ret0     ret1
+          6: ????aabb ccddeeff */
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       stbs,ma %ret0, 1(%r20)
+       extru   %ret1, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret1, 0(%r20)
+
+L$checksmst7
+       comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8
+       /* 7 byte values are returned right justified:
+             ret0     ret1
+          7: ??aabbcc ddeeffgg */
+       extru   %ret0, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       stbs,ma %ret0, 1(%r20)
+       extru   %ret1, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       b       L$done
+       stb     %ret1, 0(%r20)
+
+L$checksmst8
+       comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done
+       /* 8 byte values are returned right justified:
+             ret0     ret1
+          8: aabbccdd eeffgghh */
+       extru   %ret0, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret0, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       stbs,ma %ret0, 1(%r20)
+       extru   %ret1, 7, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 15, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       extru   %ret1, 23, 8, %r22
+       stbs,ma %r22, 1(%r20)
+       stb     %ret1, 0(%r20)
+
+L$done
+       /* all done, return */
+       copy    %r4, %sp        ; pop arg stack
+       ldw     12(%r3), %r4
+       ldwm    -64(%sp), %r3   ; .. and pop stack
+       ldw     -20(%sp), %rp
+       bv      %r0(%rp)
+       nop
+       .exit
+       .procend
+L$FE1
+
+       /* void ffi_closure_pa32(void);
+          Called with closure argument in %r21 */
+
+       .SPACE $TEXT$
+       .SUBSPA $CODE$
+       .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR
+       .import ffi_closure_inner_pa32,CODE
+       .align 4
+L$FB2
+ffi_closure_pa32
+       .proc
+       .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
+       .entry
+
+       stw     %rp, -20(%sp)
+       copy    %r3, %r1
+L$CFI21
+       copy    %sp, %r3
+L$CFI22
+       stwm    %r1, 64(%sp)
+
+       /* Put arguments onto the stack and call ffi_closure_inner.  */
+       stw     %arg0, -36(%r3)
+       stw     %arg1, -40(%r3)
+       stw     %arg2, -44(%r3)
+       stw     %arg3, -48(%r3)
+
+       copy    %r21, %arg0
+       bl      ffi_closure_inner_pa32, %r2
+       copy    %r3, %arg1
+       ldwm    -64(%sp), %r3
+       ldw     -20(%sp), %rp
+       ldw     -36(%sp), %ret0
+       bv      %r0(%rp)
+       ldw     -40(%sp), %ret1
+       .exit
+       .procend
+L$FE2:
+
+       .SPACE $PRIVATE$
+       .SUBSPA $DATA$
+
+       .align 4
+       .EXPORT _GLOBAL__F_ffi_call_pa32,DATA
+_GLOBAL__F_ffi_call_pa32
+L$frame1:
+       .word   L$ECIE1-L$SCIE1 ;# Length of Common Information Entry
+L$SCIE1:
+       .word   0x0     ;# CIE Identifier Tag
+       .byte   0x1     ;# CIE Version
+       .ascii "\0"     ;# CIE Augmentation
+       .uleb128 0x1    ;# CIE Code Alignment Factor
+       .sleb128 4      ;# CIE Data Alignment Factor
+       .byte   0x2     ;# CIE RA Column
+       .byte   0xc     ;# DW_CFA_def_cfa
+       .uleb128 0x1e
+       .uleb128 0x0
+       .align 4
+L$ECIE1:
+L$SFDE1:
+       .word   L$EFDE1-L$ASFDE1        ;# FDE Length
+L$ASFDE1:
+       .word   L$ASFDE1-L$frame1       ;# FDE CIE offset
+       .word   L$FB1   ;# FDE initial location
+       .word   L$FE1-L$FB1     ;# FDE address range
+
+       .byte   0x4     ;# DW_CFA_advance_loc4
+       .word   L$CFI11-L$FB1
+       .byte   0x83    ;# DW_CFA_offset, column 0x3
+       .uleb128 0x0
+       .byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
+       .uleb128 0x2
+       .sleb128 -5
+
+       .byte   0x4     ;# DW_CFA_advance_loc4
+       .word   L$CFI12-L$CFI11
+       .byte   0xd     ;# DW_CFA_def_cfa_register = r3
+       .uleb128 0x3
+
+       .byte   0x4     ;# DW_CFA_advance_loc4
+       .word   L$CFI13-L$CFI12
+       .byte   0x84    ;# DW_CFA_offset, column 0x4
+       .uleb128 0x3
+
+       .align 4
+L$EFDE1:
+
+L$SFDE2:
+       .word   L$EFDE2-L$ASFDE2        ;# FDE Length
+L$ASFDE2:
+       .word   L$ASFDE2-L$frame1       ;# FDE CIE offset
+       .word   L$FB2   ;# FDE initial location
+       .word   L$FE2-L$FB2     ;# FDE address range
+       .byte   0x4     ;# DW_CFA_advance_loc4
+       .word   L$CFI21-L$FB2
+       .byte   0x83    ;# DW_CFA_offset, column 0x3
+       .uleb128 0x0
+       .byte   0x11    ;# DW_CFA_offset_extended_sf
+       .uleb128 0x2
+       .sleb128 -5
+
+       .byte   0x4     ;# DW_CFA_advance_loc4
+       .word   L$CFI22-L$CFI21
+       .byte   0xd     ;# DW_CFA_def_cfa_register = r3
+       .uleb128 0x3
+
+       .align 4
+L$EFDE2:
diff --git a/Modules/_ctypes/libffi/src/x86/darwin64.S b/Modules/_ctypes/libffi/src/x86/darwin64.S
new file mode 100644 (file)
index 0000000..2f7394e
--- /dev/null
@@ -0,0 +1,416 @@
+/* -----------------------------------------------------------------------
+   darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc.
+               Copyright (c) 2008 Red Hat, Inc.
+   derived from unix64.S
+
+   x86-64 Foreign Function Interface for Darwin.
+
+   Permission is hereby granted, free of charge, to any person obtaining
+   a copy of this software and associated documentation files (the
+   ``Software''), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+   OTHER DEALINGS IN THE SOFTWARE.
+   ----------------------------------------------------------------------- */
+
+#ifdef __x86_64__
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+       .file "darwin64.S"
+.text
+
+/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
+                   void *raddr, void (*fnaddr)(void));
+
+   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
+   for this function.  This has been allocated by ffi_call.  We also
+   deallocate some of the stack that has been alloca'd.  */
+
+       .align  3
+       .globl  _ffi_call_unix64
+
+_ffi_call_unix64:
+LUW0:
+       movq    (%rsp), %r10            /* Load return address.  */
+       leaq    (%rdi, %rsi), %rax      /* Find local stack base.  */
+       movq    %rdx, (%rax)            /* Save flags.  */
+       movq    %rcx, 8(%rax)           /* Save raddr.  */
+       movq    %rbp, 16(%rax)          /* Save old frame pointer.  */
+       movq    %r10, 24(%rax)          /* Relocate return address.  */
+       movq    %rax, %rbp              /* Finalize local stack frame.  */
+LUW1:
+       movq    %rdi, %r10              /* Save a copy of the register area. */
+       movq    %r8, %r11               /* Save a copy of the target fn.  */
+       movl    %r9d, %eax              /* Set number of SSE registers.  */
+
+       /* Load up all argument registers.  */
+       movq    (%r10), %rdi
+       movq    8(%r10), %rsi
+       movq    16(%r10), %rdx
+       movq    24(%r10), %rcx
+       movq    32(%r10), %r8
+       movq    40(%r10), %r9
+       testl   %eax, %eax
+       jnz     Lload_sse
+Lret_from_load_sse:
+
+       /* Deallocate the reg arg area.  */
+       leaq    176(%r10), %rsp
+
+       /* Call the user function.  */
+       call    *%r11
+
+       /* Deallocate stack arg area; local stack frame in redzone.  */
+       leaq    24(%rbp), %rsp
+
+       movq    0(%rbp), %rcx           /* Reload flags.  */
+       movq    8(%rbp), %rdi           /* Reload raddr.  */
+       movq    16(%rbp), %rbp          /* Reload old frame pointer.  */
+LUW2:
+
+       /* The first byte of the flags contains the FFI_TYPE.  */
+       movzbl  %cl, %r10d
+       leaq    Lstore_table(%rip), %r11
+       movslq  (%r11, %r10, 4), %r10
+       addq    %r11, %r10
+       jmp     *%r10
+
+Lstore_table:
+       .long   Lst_void-Lstore_table           /* FFI_TYPE_VOID */
+       .long   Lst_sint32-Lstore_table         /* FFI_TYPE_INT */
+       .long   Lst_float-Lstore_table          /* FFI_TYPE_FLOAT */
+       .long   Lst_double-Lstore_table         /* FFI_TYPE_DOUBLE */
+       .long   Lst_ldouble-Lstore_table        /* FFI_TYPE_LONGDOUBLE */
+       .long   Lst_uint8-Lstore_table          /* FFI_TYPE_UINT8 */
+       .long   Lst_sint8-Lstore_table          /* FFI_TYPE_SINT8 */
+       .long   Lst_uint16-Lstore_table         /* FFI_TYPE_UINT16 */
+       .long   Lst_sint16-Lstore_table         /* FFI_TYPE_SINT16 */
+       .long   Lst_uint32-Lstore_table         /* FFI_TYPE_UINT32 */
+       .long   Lst_sint32-Lstore_table         /* FFI_TYPE_SINT32 */
+       .long   Lst_int64-Lstore_table          /* FFI_TYPE_UINT64 */
+       .long   Lst_int64-Lstore_table          /* FFI_TYPE_SINT64 */
+       .long   Lst_struct-Lstore_table         /* FFI_TYPE_STRUCT */
+       .long   Lst_int64-Lstore_table          /* FFI_TYPE_POINTER */
+
+       .text
+       .align  3
+Lst_void:
+       ret
+       .align  3
+Lst_uint8:
+       movzbq  %al, %rax
+       movq    %rax, (%rdi)
+       ret
+       .align  3
+Lst_sint8:
+       movsbq  %al, %rax
+       movq    %rax, (%rdi)
+       ret
+       .align  3
+Lst_uint16:
+       movzwq  %ax, %rax
+       movq    %rax, (%rdi)
+       .align  3
+Lst_sint16:
+       movswq  %ax, %rax
+       movq    %rax, (%rdi)
+       ret
+       .align  3
+Lst_uint32:
+       movl    %eax, %eax
+       movq    %rax, (%rdi)
+       .align  3
+Lst_sint32:
+       cltq
+       movq    %rax, (%rdi)
+       ret
+       .align  3
+Lst_int64:
+       movq    %rax, (%rdi)
+       ret
+       .align  3
+Lst_float:
+       movss   %xmm0, (%rdi)
+       ret
+       .align  3
+Lst_double:
+       movsd   %xmm0, (%rdi)
+       ret
+Lst_ldouble:
+       fstpt   (%rdi)
+       ret
+       .align  3
+Lst_struct:
+       leaq    -20(%rsp), %rsi         /* Scratch area in redzone.  */
+
+       /* We have to locate the values now, and since we don't want to
+          write too much data into the user's return value, we spill the
+          value to a 16 byte scratch area first.  Bits 8, 9, and 10
+          control where the values are located.  Only one of the three
+          bits will be set; see ffi_prep_cif_machdep for the pattern.  */
+       movd    %xmm0, %r10
+       movd    %xmm1, %r11
+       testl   $0x100, %ecx
+       cmovnz  %rax, %rdx
+       cmovnz  %r10, %rax
+       testl   $0x200, %ecx
+       cmovnz  %r10, %rdx
+       testl   $0x400, %ecx
+       cmovnz  %r10, %rax
+       cmovnz  %r11, %rdx
+       movq    %rax, (%rsi)
+       movq    %rdx, 8(%rsi)
+
+       /* Bits 12-31 contain the true size of the structure.  Copy from
+          the scratch area to the true destination.  */
+       shrl    $12, %ecx
+       rep movsb
+       ret
+
+       /* Many times we can avoid loading any SSE registers at all.
+          It's not worth an indirect jump to load the exact set of
+          SSE registers needed; zero or all is a good compromise.  */
+       .align  3
+LUW3:
+Lload_sse:
+       movdqa  48(%r10), %xmm0
+       movdqa  64(%r10), %xmm1
+       movdqa  80(%r10), %xmm2
+       movdqa  96(%r10), %xmm3
+       movdqa  112(%r10), %xmm4
+       movdqa  128(%r10), %xmm5
+       movdqa  144(%r10), %xmm6
+       movdqa  160(%r10), %xmm7
+       jmp     Lret_from_load_sse
+
+LUW4:
+       .align  3
+       .globl  _ffi_closure_unix64
+
+_ffi_closure_unix64:
+LUW5:
+       /* The carry flag is set by the trampoline iff SSE registers
+          are used.  Don't clobber it before the branch instruction.  */
+       leaq    -200(%rsp), %rsp
+LUW6:
+       movq    %rdi, (%rsp)
+       movq    %rsi, 8(%rsp)
+       movq    %rdx, 16(%rsp)
+       movq    %rcx, 24(%rsp)
+       movq    %r8, 32(%rsp)
+       movq    %r9, 40(%rsp)
+       jc      Lsave_sse
+Lret_from_save_sse:
+
+       movq    %r10, %rdi
+       leaq    176(%rsp), %rsi
+       movq    %rsp, %rdx
+       leaq    208(%rsp), %rcx
+       call    _ffi_closure_unix64_inner
+
+       /* Deallocate stack frame early; return value is now in redzone.  */
+       addq    $200, %rsp
+LUW7:
+
+       /* The first byte of the return value contains the FFI_TYPE.  */
+       movzbl  %al, %r10d
+       leaq    Lload_table(%rip), %r11
+       movslq  (%r11, %r10, 4), %r10
+       addq    %r11, %r10
+       jmp     *%r10
+
+Lload_table:
+       .long   Lld_void-Lload_table            /* FFI_TYPE_VOID */
+       .long   Lld_int32-Lload_table           /* FFI_TYPE_INT */
+       .long   Lld_float-Lload_table           /* FFI_TYPE_FLOAT */
+       .long   Lld_double-Lload_table          /* FFI_TYPE_DOUBLE */
+       .long   Lld_ldouble-Lload_table         /* FFI_TYPE_LONGDOUBLE */
+       .long   Lld_int8-Lload_table            /* FFI_TYPE_UINT8 */
+       .long   Lld_int8-Lload_table            /* FFI_TYPE_SINT8 */
+       .long   Lld_int16-Lload_table           /* FFI_TYPE_UINT16 */
+       .long   Lld_int16-Lload_table           /* FFI_TYPE_SINT16 */
+       .long   Lld_int32-Lload_table           /* FFI_TYPE_UINT32 */
+       .long   Lld_int32-Lload_table           /* FFI_TYPE_SINT32 */
+       .long   Lld_int64-Lload_table           /* FFI_TYPE_UINT64 */
+       .long   Lld_int64-Lload_table           /* FFI_TYPE_SINT64 */
+       .long   Lld_struct-Lload_table          /* FFI_TYPE_STRUCT */
+       .long   Lld_int64-Lload_table           /* FFI_TYPE_POINTER */
+
+       .text
+       .align  3
+Lld_void:
+       ret
+       .align  3
+Lld_int8:
+       movzbl  -24(%rsp), %eax
+       ret
+       .align  3
+Lld_int16:
+       movzwl  -24(%rsp), %eax
+       ret
+       .align  3
+Lld_int32:
+       movl    -24(%rsp), %eax
+       ret
+       .align  3
+Lld_int64:
+       movq    -24(%rsp), %rax
+       ret
+       .align  3
+Lld_float:
+       movss   -24(%rsp), %xmm0
+       ret
+       .align  3
+Lld_double:
+       movsd   -24(%rsp), %xmm0
+       ret
+       .align  3
+Lld_ldouble:
+       fldt    -24(%rsp)
+       ret
+       .align  3
+Lld_struct:
+       /* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
+          %rax/%xmm0, %xmm0/%xmm1.  We collapse two by always loading
+          both rdx and xmm1 with the second word.  For the remaining,
+          bit 8 set means xmm0 gets the second word, and bit 9 means
+          that rax gets the second word.  */
+       movq    -24(%rsp), %rcx
+       movq    -16(%rsp), %rdx
+       movq    -16(%rsp), %xmm1
+       testl   $0x100, %eax
+       cmovnz  %rdx, %rcx
+       movd    %rcx, %xmm0
+       testl   $0x200, %eax
+       movq    -24(%rsp), %rax
+       cmovnz  %rdx, %rax
+       ret
+
+       /* See the comment above Lload_sse; the same logic applies here.  */
+       .align  3
+LUW8:
+Lsave_sse:
+       movdqa  %xmm0, 48(%rsp)
+       movdqa  %xmm1, 64(%rsp)
+       movdqa  %xmm2, 80(%rsp)
+       movdqa  %xmm3, 96(%rsp)
+       movdqa  %xmm4, 112(%rsp)
+       movdqa  %xmm5, 128(%rsp)
+       movdqa  %xmm6, 144(%rsp)
+       movdqa  %xmm7, 160(%rsp)
+       jmp     Lret_from_save_sse
+
+LUW9:
+.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+       .set    L$set$0,LECIE1-LSCIE1           /* CIE Length */
+       .long   L$set$0
+LSCIE1:
+       .long   0x0             /* CIE Identifier Tag */
+       .byte   0x1             /* CIE Version */
+       .ascii  "zR\0"          /* CIE Augmentation */
+       .byte   0x1             /* uleb128 0x1; CIE Code Alignment Factor */
+       .byte   0x78            /* sleb128 -8; CIE Data Alignment Factor */
+       .byte   0x10            /* CIE RA Column */
+       .byte   0x1             /* uleb128 0x1; Augmentation size */
+       .byte   0x10            /* FDE Encoding (pcrel sdata4) */
+       .byte   0xc             /* DW_CFA_def_cfa, %rsp offset 8 */
+       .byte   0x7             /* uleb128 0x7 */
+       .byte   0x8             /* uleb128 0x8 */
+       .byte   0x90            /* DW_CFA_offset, column 0x10 */
+       .byte   0x1
+       .align  3
+LECIE1:
+       .globl _ffi_call_unix64.eh
+_ffi_call_unix64.eh:
+LSFDE1:
+       .set    L$set$1,LEFDE1-LASFDE1  /* FDE Length */
+       .long   L$set$1
+LASFDE1:
+       .long   LASFDE1-EH_frame1       /* FDE CIE offset */
+       .quad   LUW0-.                  /* FDE initial location */
+       .set    L$set$2,LUW4-LUW0       /* FDE address range */
+       .quad   L$set$2
+       .byte   0x0                     /* Augmentation size */
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$3,LUW1-LUW0
+       .long   L$set$3
+
+       /* New stack frame based off rbp.  This is a itty bit of unwind
+          trickery in that the CFA *has* changed.  There is no easy way
+          to describe it correctly on entry to the function.  Fortunately,
+          it doesn't matter too much since at all points we can correctly
+          unwind back to ffi_call.  Note that the location to which we
+          moved the return address is (the new) CFA-8, so from the
+          perspective of the unwind info, it hasn't moved.  */
+       .byte   0xc                     /* DW_CFA_def_cfa, %rbp offset 32 */
+       .byte   0x6
+       .byte   0x20
+       .byte   0x80+6                  /* DW_CFA_offset, %rbp offset 2*-8 */
+       .byte   0x2
+       .byte   0xa                     /* DW_CFA_remember_state */
+
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$4,LUW2-LUW1
+       .long   L$set$4
+       .byte   0xc                     /* DW_CFA_def_cfa, %rsp offset 8 */
+       .byte   0x7
+       .byte   0x8
+       .byte   0xc0+6                  /* DW_CFA_restore, %rbp */
+
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$5,LUW3-LUW2
+       .long   L$set$5
+       .byte   0xb                     /* DW_CFA_restore_state */
+
+       .align  3
+LEFDE1:
+       .globl _ffi_closure_unix64.eh
+_ffi_closure_unix64.eh:
+LSFDE3:
+       .set    L$set$6,LEFDE3-LASFDE3  /* FDE Length */
+       .long   L$set$6
+LASFDE3:
+       .long   LASFDE3-EH_frame1       /* FDE CIE offset */
+       .quad   LUW5-.                  /* FDE initial location */
+       .set    L$set$7,LUW9-LUW5       /* FDE address range */
+       .quad   L$set$7
+       .byte   0x0                     /* Augmentation size */
+
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$8,LUW6-LUW5
+       .long   L$set$8
+       .byte   0xe                     /* DW_CFA_def_cfa_offset */
+       .byte   208,1                   /* uleb128 208 */
+       .byte   0xa                     /* DW_CFA_remember_state */
+
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$9,LUW7-LUW6
+       .long   L$set$9
+       .byte   0xe                     /* DW_CFA_def_cfa_offset */
+       .byte   0x8
+
+       .byte   0x4                     /* DW_CFA_advance_loc4 */
+       .set    L$set$10,LUW8-LUW7
+       .long   L$set$10
+       .byte   0xb                     /* DW_CFA_restore_state */
+
+       .align  3
+LEFDE3:
+       .subsections_via_symbols
+
+#endif /* __x86_64__ */
index 63c99990c39baa5efb4a4a6571696ebd0693035e..767effb8380a709c95ef69321eacdda4b5678c3f 100644 (file)
@@ -349,14 +349,14 @@ ffi_prep_closure_loc (ffi_closure* closure,
     {
       FFI_INIT_TRAMPOLINE (&closure->tramp[0],
                            &ffi_closure_SYSV,
-                           (void*)closure);
+                           (void*)codeloc);
     }
 #ifdef X86_WIN32
   else if (cif->abi == FFI_STDCALL)
     {
       FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
                                    &ffi_closure_STDCALL,
-                                   (void*)closure, cif->bytes);
+                                   (void*)codeloc, cif->bytes);
     }
 #endif
   else
diff --git a/Modules/_ctypes/libffi/src/x86/freebsd.S b/Modules/_ctypes/libffi/src/x86/freebsd.S
new file mode 100644 (file)
index 0000000..afde513
--- /dev/null
@@ -0,0 +1,458 @@
+/* -----------------------------------------------------------------------
+   freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
+              Copyright (c) 2008  Björn König
+       
+   X86 Foreign Function Interface for FreeBSD
+
+   Permission is hereby granted, free of charge, to any person obtaining
+   a copy of this software and associated documentation files (the
+   ``Software''), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
+----------------------------------------------------------------------- */
+
+#ifndef __x86_64__
+
+#define LIBFFI_ASM     
+#include <fficonfig.h>
+#include <ffi.h>
+
+.text
+
+.globl ffi_prep_args
+
+       .align 4
+.globl ffi_call_SYSV
+        .type    ffi_call_SYSV,@function
+
+ffi_call_SYSV:
+.LFB1:
+        pushl %ebp
+.LCFI0:
+        movl  %esp,%ebp
+.LCFI1:
+       /* Make room for all of the new args.  */
+       movl  16(%ebp),%ecx
+       subl  %ecx,%esp
+
+       movl  %esp,%eax
+
+       /* Place all of the ffi_prep_args in position  */
+       pushl 12(%ebp)
+       pushl %eax
+       call  *8(%ebp)
+
+       /* Return stack to previous state and call the function  */
+       addl  $8,%esp   
+
+       call  *28(%ebp)
+
+       /* Load %ecx with the return type code  */
+       movl  20(%ebp),%ecx     
+
+       /* Protect %esi.  We're going to pop it in the epilogue.  */
+       pushl %esi
+
+       /* If the return value pointer is NULL, assume no return value.  */
+       cmpl  $0,24(%ebp)
+       jne  0f
+
+       /* Even if there is no space for the return value, we are 
+          obliged to handle floating-point values.  */
+       cmpl  $FFI_TYPE_FLOAT,%ecx
+       jne   noretval
+       fstp  %st(0)
+
+        jmp   epilogue
+
+0:
+       call  1f
+
+.Lstore_table:
+       .long   noretval-.Lstore_table  /* FFI_TYPE_VOID */
+       .long   retint-.Lstore_table    /* FFI_TYPE_INT */
+       .long   retfloat-.Lstore_table  /* FFI_TYPE_FLOAT */
+       .long   retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */
+       .long   retlongdouble-.Lstore_table     /* FFI_TYPE_LONGDOUBLE */
+       .long   retuint8-.Lstore_table  /* FFI_TYPE_UINT8 */
+       .long   retsint8-.Lstore_table  /* FFI_TYPE_SINT8 */
+       .long   retuint16-.Lstore_table /* FFI_TYPE_UINT16 */
+       .long   retsint16-.Lstore_table /* FFI_TYPE_SINT16 */
+       .long   retint-.Lstore_table    /* FFI_TYPE_UINT32 */
+       .long   retint-.Lstore_table    /* FFI_TYPE_SINT32 */
+       .long   retint64-.Lstore_table  /* FFI_TYPE_UINT64 */
+       .long   retint64-.Lstore_table  /* FFI_TYPE_SINT64 */
+       .long   retstruct-.Lstore_table /* FFI_TYPE_STRUCT */
+       .long   retint-.Lstore_table    /* FFI_TYPE_POINTER */
+       .long   retstruct1b-.Lstore_table       /* FFI_TYPE_SMALL_STRUCT_1B */
+       .long   retstruct2b-.Lstore_table       /* FFI_TYPE_SMALL_STRUCT_2B */
+
+1:
+       pop  %esi
+       add  (%esi, %ecx, 4), %esi
+       jmp  *%esi
+
+       /* Sign/zero extend as appropriate.  */
+retsint8:
+       movsbl  %al, %eax
+       jmp  retint
+
+retsint16:
+       movswl  %ax, %eax
+       jmp  retint
+
+retuint8:
+       movzbl  %al, %eax
+       jmp  retint
+
+retuint16:
+       movzwl  %ax, %eax
+       jmp  retint
+
+retfloat:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx     
+       fstps (%ecx)
+       jmp   epilogue
+
+retdouble:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx     
+       fstpl (%ecx)
+       jmp   epilogue
+
+retlongdouble:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx     
+       fstpt (%ecx)
+       jmp   epilogue
+       
+retint64:      
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx     
+       movl  %eax,0(%ecx)
+       movl  %edx,4(%ecx)
+       jmp   epilogue
+       
+retstruct1b:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx
+       movb  %al,0(%ecx)
+       jmp   epilogue
+
+retstruct2b:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx
+       movw  %ax,0(%ecx)
+       jmp   epilogue
+
+retint:
+       /* Load %ecx with the pointer to storage for the return value  */
+       movl  24(%ebp),%ecx     
+       movl  %eax,0(%ecx)
+
+retstruct:
+       /* Nothing to do!  */
+
+noretval:
+epilogue:
+        popl %esi
+        movl %ebp,%esp
+        popl %ebp
+        ret
+.LFE1:
+.ffi_call_SYSV_end:
+        .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+       .align  4
+FFI_HIDDEN (ffi_closure_SYSV)
+.globl ffi_closure_SYSV
+       .type   ffi_closure_SYSV, @function
+
+ffi_closure_SYSV:
+.LFB2:
+       pushl   %ebp
+.LCFI2:
+       movl    %esp, %ebp
+.LCFI3:
+       subl    $40, %esp
+       leal    -24(%ebp), %edx
+       movl    %edx, -12(%ebp) /* resp */
+       leal    8(%ebp), %edx
+       movl    %edx, 4(%esp)   /* args = __builtin_dwarf_cfa () */
+       leal    -12(%ebp), %edx
+       movl    %edx, (%esp)    /* &resp */
+#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
+       call    ffi_closure_SYSV_inner
+#else
+       movl    %ebx, 8(%esp)
+.LCFI7:
+       call    1f
+1:     popl    %ebx
+       addl    $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
+       call    ffi_closure_SYSV_inner@PLT
+       movl    8(%esp), %ebx
+#endif
+       movl    -12(%ebp), %ecx
+       cmpl    $FFI_TYPE_INT, %eax
+       je      .Lcls_retint
+
+       /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+          FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+       cmpl    $FFI_TYPE_UINT64, %eax
+       jge     0f
+       cmpl    $FFI_TYPE_UINT8, %eax
+       jge     .Lcls_retint
+       
+0:     cmpl    $FFI_TYPE_FLOAT, %eax
+       je      .Lcls_retfloat
+       cmpl    $FFI_TYPE_DOUBLE, %eax
+       je      .Lcls_retdouble
+       cmpl    $FFI_TYPE_LONGDOUBLE, %eax
+       je      .Lcls_retldouble
+       cmpl    $FFI_TYPE_SINT64, %eax
+       je      .Lcls_retllong
+       cmpl    $FFI_TYPE_SMALL_STRUCT_1B, %eax
+       je      .Lcls_retstruct1b
+       cmpl    $FFI_TYPE_SMALL_STRUCT_2B, %eax
+       je      .Lcls_retstruct2b
+       cmpl    $FFI_TYPE_STRUCT, %eax
+       je      .Lcls_retstruct
+.Lcls_epilogue:
+       movl    %ebp, %esp
+       popl    %ebp
+       ret
+.Lcls_retint:
+       movl    (%ecx), %eax
+       jmp     .Lcls_epilogue
+.Lcls_retfloat:
+       flds    (%ecx)
+       jmp     .Lcls_epilogue
+.Lcls_retdouble:
+       fldl    (%ecx)
+       jmp     .Lcls_epilogue
+.Lcls_retldouble:
+       fldt    (%ecx)
+       jmp     .Lcls_epilogue
+.Lcls_retllong:
+       movl    (%ecx), %eax
+       movl    4(%ecx), %edx
+       jmp     .Lcls_epilogue
+.Lcls_retstruct1b:
+       movsbl  (%ecx), %eax
+       jmp     .Lcls_epilogue
+.Lcls_retstruct2b:
+       movswl  (%ecx), %eax
+       jmp     .Lcls_epilogue
+.Lcls_retstruct:
+       movl    %ebp, %esp
+       popl    %ebp
+       ret     $4
+.LFE2:
+       .size   ffi_closure_SYSV, .-ffi_closure_SYSV
+
+#if !FFI_NO_RAW_API
+
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#define CIF_FLAGS_OFFSET 20
+
+       .align  4
+FFI_HIDDEN (ffi_closure_raw_SYSV)
+.globl ffi_closure_raw_SYSV
+       .type   ffi_closure_raw_SYSV, @function
+
+ffi_closure_raw_SYSV:
+.LFB3:
+       pushl   %ebp
+.LCFI4:
+       movl    %esp, %ebp
+.LCFI5:
+       pushl   %esi
+.LCFI6:
+       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    8(%ebp), %edx   /* __builtin_dwarf_cfa () */
+       movl    %edx, 8(%esp)   /* raw_args */
+       leal    -24(%ebp), %edx
+       movl    %edx, 4(%esp)   /* &res */
+       movl    %esi, (%esp)    /* cif */
+       call    *RAW_CLOSURE_FUN_OFFSET(%eax)            /* closure->fun */
+       movl    CIF_FLAGS_OFFSET(%esi), %eax             /* rtype */
+       cmpl    $FFI_TYPE_INT, %eax
+       je      .Lrcls_retint
+
+       /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+          FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+       cmpl    $FFI_TYPE_UINT64, %eax
+       jge     0f
+       cmpl    $FFI_TYPE_UINT8, %eax
+       jge     .Lrcls_retint
+0:
+       cmpl    $FFI_TYPE_FLOAT, %eax
+       je      .Lrcls_retfloat
+       cmpl    $FFI_TYPE_DOUBLE, %eax
+       je      .Lrcls_retdouble
+       cmpl    $FFI_TYPE_LONGDOUBLE, %eax
+       je      .Lrcls_retldouble
+       cmpl    $FFI_TYPE_SINT64, %eax
+       je      .Lrcls_retllong
+.Lrcls_epilogue:
+       addl    $36, %esp
+       popl    %esi
+       popl    %ebp
+       ret
+.Lrcls_retint:
+       movl    -24(%ebp), %eax
+       jmp     .Lrcls_epilogue
+.Lrcls_retfloat:
+       flds    -24(%ebp)
+       jmp     .Lrcls_epilogue
+.Lrcls_retdouble:
+       fldl    -24(%ebp)
+       jmp     .Lrcls_epilogue
+.Lrcls_retldouble:
+       fldt    -24(%ebp)
+       jmp     .Lrcls_epilogue
+.Lrcls_retllong:
+       movl    -24(%ebp), %eax
+       movl    -20(%ebp), %edx
+       jmp     .Lrcls_epilogue
+.LFE3:
+       .size   ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
+#endif
+
+       .section        .eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+       .long   .LECIE1-.LSCIE1 /* Length of Common Information Entry */
+.LSCIE1:
+       .long   0x0     /* CIE Identifier Tag */
+       .byte   0x1     /* CIE Version */
+#ifdef __PIC__
+       .ascii "zR\0"   /* CIE Augmentation */
+#else
+       .ascii "\0"     /* CIE Augmentation */
+#endif
+       .byte   0x1     /* .uleb128 0x1; CIE Code Alignment Factor */
+       .byte   0x7c    /* .sleb128 -4; CIE Data Alignment Factor */
+       .byte   0x8     /* CIE RA Column */
+#ifdef __PIC__
+       .byte   0x1     /* .uleb128 0x1; Augmentation size */
+       .byte   0x1b    /* FDE Encoding (pcrel sdata4) */
+#endif
+       .byte   0xc     /* DW_CFA_def_cfa */
+       .byte   0x4     /* .uleb128 0x4 */
+       .byte   0x4     /* .uleb128 0x4 */
+       .byte   0x88    /* DW_CFA_offset, column 0x8 */
+       .byte   0x1     /* .uleb128 0x1 */
+       .align 4
+.LECIE1:
+.LSFDE1:
+       .long   .LEFDE1-.LASFDE1        /* FDE Length */
+.LASFDE1:
+       .long   .LASFDE1-.Lframe1       /* FDE CIE offset */
+#ifdef __PIC__
+       .long   .LFB1-. /* FDE initial location */
+#else
+       .long   .LFB1   /* FDE initial location */
+#endif
+       .long   .LFE1-.LFB1     /* FDE address range */
+#ifdef __PIC__
+       .byte   0x0     /* .uleb128 0x0; Augmentation size */
+#endif
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI0-.LFB1
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x8     /* .uleb128 0x8 */
+       .byte   0x85    /* DW_CFA_offset, column 0x5 */
+       .byte   0x2     /* .uleb128 0x2 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI1-.LCFI0
+       .byte   0xd     /* DW_CFA_def_cfa_register */
+       .byte   0x5     /* .uleb128 0x5 */
+       .align 4
+.LEFDE1:
+.LSFDE2:
+       .long   .LEFDE2-.LASFDE2        /* FDE Length */
+.LASFDE2:
+       .long   .LASFDE2-.Lframe1       /* FDE CIE offset */
+#ifdef __PIC__
+       .long   .LFB2-. /* FDE initial location */
+#else
+       .long   .LFB2
+#endif
+       .long   .LFE2-.LFB2     /* FDE address range */
+#ifdef __PIC__
+       .byte   0x0     /* .uleb128 0x0; Augmentation size */
+#endif
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI2-.LFB2
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x8     /* .uleb128 0x8 */
+       .byte   0x85    /* DW_CFA_offset, column 0x5 */
+       .byte   0x2     /* .uleb128 0x2 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI3-.LCFI2
+       .byte   0xd     /* DW_CFA_def_cfa_register */
+       .byte   0x5     /* .uleb128 0x5 */
+#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI7-.LCFI3
+       .byte   0x83    /* DW_CFA_offset, column 0x3 */
+       .byte   0xa     /* .uleb128 0xa */
+#endif
+       .align 4
+.LEFDE2:
+
+#if !FFI_NO_RAW_API
+
+.LSFDE3:
+       .long   .LEFDE3-.LASFDE3        /* FDE Length */
+.LASFDE3:
+       .long   .LASFDE3-.Lframe1       /* FDE CIE offset */
+#ifdef __PIC__
+       .long   .LFB3-. /* FDE initial location */
+#else
+       .long   .LFB3
+#endif
+       .long   .LFE3-.LFB3     /* FDE address range */
+#ifdef __PIC__
+       .byte   0x0     /* .uleb128 0x0; Augmentation size */
+#endif
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI4-.LFB3
+       .byte   0xe     /* DW_CFA_def_cfa_offset */
+       .byte   0x8     /* .uleb128 0x8 */
+       .byte   0x85    /* DW_CFA_offset, column 0x5 */
+       .byte   0x2     /* .uleb128 0x2 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI5-.LCFI4
+       .byte   0xd     /* DW_CFA_def_cfa_register */
+       .byte   0x5     /* .uleb128 0x5 */
+       .byte   0x4     /* DW_CFA_advance_loc4 */
+       .long   .LCFI6-.LCFI5
+       .byte   0x86    /* DW_CFA_offset, column 0x6 */
+       .byte   0x3     /* .uleb128 0x3 */
+       .align 4
+.LEFDE3:
+
+#endif
+
+#endif /* ifndef __x86_64__ */