ffi 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +9 -12
  3. data/ext/ffi_c/AbstractMemory.c +11 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +24 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +8 -4
  9. data/ext/ffi_c/ClosurePool.c +7 -5
  10. data/ext/ffi_c/DynamicLibrary.c +0 -1
  11. data/ext/ffi_c/Function.c +19 -2
  12. data/ext/ffi_c/MemoryPointer.c +3 -3
  13. data/ext/ffi_c/MethodHandle.c +1 -1
  14. data/ext/ffi_c/Pointer.c +23 -9
  15. data/ext/ffi_c/Struct.c +142 -69
  16. data/ext/ffi_c/Struct.h +16 -7
  17. data/ext/ffi_c/StructLayout.c +92 -55
  18. data/ext/ffi_c/Type.c +5 -22
  19. data/ext/ffi_c/Type.h +1 -1
  20. data/ext/ffi_c/Types.c +8 -2
  21. data/ext/ffi_c/Types.h +2 -0
  22. data/ext/ffi_c/Variadic.c +7 -19
  23. data/ext/ffi_c/endian.h +1 -1
  24. data/ext/ffi_c/extconf.rb +20 -11
  25. data/ext/ffi_c/libffi/ChangeLog +900 -84
  26. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/Makefile.am +14 -4
  29. data/ext/ffi_c/libffi/Makefile.in +362 -211
  30. data/ext/ffi_c/libffi/README +70 -92
  31. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  32. data/ext/ffi_c/libffi/config.guess +125 -143
  33. data/ext/ffi_c/libffi/config.sub +103 -27
  34. data/ext/ffi_c/libffi/configure +11364 -18497
  35. data/ext/ffi_c/libffi/configure.ac +43 -4
  36. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  37. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  38. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  39. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  40. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  41. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  42. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  43. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  44. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  45. data/ext/ffi_c/libffi/libtool-version +1 -1
  46. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  47. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  48. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  49. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  50. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  51. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  52. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  53. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  54. data/ext/ffi_c/libffi/missing +15 -8
  55. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  56. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  57. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  58. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  59. data/ext/ffi_c/libffi/src/closures.c +47 -10
  60. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  61. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  62. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  63. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  64. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  65. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  66. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  67. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  68. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  69. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  70. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  71. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  72. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  73. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  74. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  75. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  76. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  77. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  78. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  79. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  80. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  81. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  82. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  83. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  84. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  85. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  86. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  87. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  88. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  89. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  183. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  184. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  185. data/ext/ffi_c/libffi.bsd.mk +1 -1
  186. data/lib/ffi/autopointer.rb +79 -20
  187. data/lib/ffi/buffer.rb +4 -0
  188. data/lib/ffi/callback.rb +4 -10
  189. data/lib/ffi/enum.rb +28 -0
  190. data/lib/ffi/ffi.rb +0 -1
  191. data/lib/ffi/io.rb +28 -0
  192. data/lib/ffi/library.rb +237 -182
  193. data/lib/ffi/memorypointer.rb +28 -62
  194. data/lib/ffi/platform.rb +27 -0
  195. data/lib/ffi/pointer.rb +28 -0
  196. data/lib/ffi/struct.rb +55 -1
  197. data/lib/ffi/types.rb +29 -0
  198. data/lib/ffi/variadic.rb +29 -0
  199. data/spec/ffi/library_spec.rb +31 -5
  200. data/spec/ffi/managed_struct_spec.rb +1 -1
  201. data/spec/ffi/pointer_spec.rb +1 -1
  202. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  203. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  204. data/spec/ffi/spec_helper.rb +5 -1
  205. data/spec/ffi/struct_spec.rb +77 -0
  206. metadata +28 -18
  207. data/ext/ffi_c/libffi/TODO +0 -1
  208. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  209. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  210. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  211. data/ext/ffi_c/libffi/ltconfig +0 -2862
  212. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -1,5 +1,5 @@
1
1
  /* -----------------------------------------------------------------------
2
- win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc.
2
+ win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc.
3
3
  Copyright (c) 2001 John Beniton
4
4
  Copyright (c) 2002 Ranjit Mathew
5
5
 
@@ -17,32 +17,33 @@
17
17
  The above copyright notice and this permission notice shall be included
18
18
  in all copies or substantial portions of the Software.
19
19
 
20
- THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
21
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
24
- ANY CLAIM, DAMAGES OR
25
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27
- OTHER DEALINGS IN THE SOFTWARE.
28
- ----------------------------------------------------------------------- */
20
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
21
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27
+ DEALINGS IN THE SOFTWARE.
28
+ -----------------------------------------------------------------------
29
+ */
29
30
 
30
31
  #define LIBFFI_ASM
31
32
  #include <fficonfig.h>
32
33
  #include <ffi.h>
33
34
 
34
- .text
35
-
36
- .globl ffi_prep_args
35
+ .text
37
36
 
38
37
  # This assumes we are using gas.
39
38
  .balign 16
40
- .globl _ffi_call_SYSV
41
-
39
+ .globl _ffi_call_SYSV
40
+ .def _ffi_call_SYSV; .scl 2; .type 32; .endef
42
41
  _ffi_call_SYSV:
42
+ .LFB1:
43
43
  pushl %ebp
44
+ .LCFI0:
44
45
  movl %esp,%ebp
45
-
46
+ .LCFI1:
46
47
  # Make room for all of the new args.
47
48
  movl 16(%ebp),%ecx
48
49
  subl %ecx,%esp
@@ -62,100 +63,137 @@ _ffi_call_SYSV:
62
63
 
63
64
  call *28(%ebp)
64
65
 
65
- # Remove the space we pushed for the args
66
- movl 16(%ebp),%ecx
67
- addl %ecx,%esp
68
-
69
66
  # Load %ecx with the return type code
70
67
  movl 20(%ebp),%ecx
71
68
 
72
69
  # If the return value pointer is NULL, assume no return value.
73
70
  cmpl $0,24(%ebp)
74
- jne retint
71
+ jne 0f
75
72
 
76
73
  # Even if there is no space for the return value, we are
77
74
  # obliged to handle floating-point values.
78
75
  cmpl $FFI_TYPE_FLOAT,%ecx
79
- jne noretval
76
+ jne .Lnoretval
80
77
  fstp %st(0)
81
78
 
82
- jmp epilogue
83
-
84
- retint:
85
- cmpl $FFI_TYPE_INT,%ecx
86
- jne retfloat
79
+ jmp .Lepilogue
80
+
81
+ 0:
82
+ call 1f
83
+ # Do not insert anything here between the call and the jump table.
84
+ .Lstore_table:
85
+ .long .Lnoretval /* FFI_TYPE_VOID */
86
+ .long .Lretint /* FFI_TYPE_INT */
87
+ .long .Lretfloat /* FFI_TYPE_FLOAT */
88
+ .long .Lretdouble /* FFI_TYPE_DOUBLE */
89
+ .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */
90
+ .long .Lretuint8 /* FFI_TYPE_UINT8 */
91
+ .long .Lretsint8 /* FFI_TYPE_SINT8 */
92
+ .long .Lretuint16 /* FFI_TYPE_UINT16 */
93
+ .long .Lretsint16 /* FFI_TYPE_SINT16 */
94
+ .long .Lretint /* FFI_TYPE_UINT32 */
95
+ .long .Lretint /* FFI_TYPE_SINT32 */
96
+ .long .Lretint64 /* FFI_TYPE_UINT64 */
97
+ .long .Lretint64 /* FFI_TYPE_SINT64 */
98
+ .long .Lretstruct /* FFI_TYPE_STRUCT */
99
+ .long .Lretint /* FFI_TYPE_POINTER */
100
+ .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
101
+ .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
102
+ .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
103
+ 1:
104
+ add %ecx, %ecx
105
+ add %ecx, %ecx
106
+ add (%esp),%ecx
107
+ add $4, %esp
108
+ jmp *(%ecx)
109
+
110
+ /* Sign/zero extend as appropriate. */
111
+ .Lretsint8:
112
+ movsbl %al, %eax
113
+ jmp .Lretint
114
+
115
+ .Lretsint16:
116
+ movswl %ax, %eax
117
+ jmp .Lretint
118
+
119
+ .Lretuint8:
120
+ movzbl %al, %eax
121
+ jmp .Lretint
122
+
123
+ .Lretuint16:
124
+ movzwl %ax, %eax
125
+ jmp .Lretint
126
+
127
+ .Lretint:
87
128
  # Load %ecx with the pointer to storage for the return value
88
129
  movl 24(%ebp),%ecx
89
130
  movl %eax,0(%ecx)
90
- jmp epilogue
131
+ jmp .Lepilogue
91
132
 
92
- retfloat:
93
- cmpl $FFI_TYPE_FLOAT,%ecx
94
- jne retdouble
133
+ .Lretfloat:
95
134
  # Load %ecx with the pointer to storage for the return value
96
135
  movl 24(%ebp),%ecx
97
136
  fstps (%ecx)
98
- jmp epilogue
137
+ jmp .Lepilogue
99
138
 
100
- retdouble:
101
- cmpl $FFI_TYPE_DOUBLE,%ecx
102
- jne retlongdouble
139
+ .Lretdouble:
103
140
  # Load %ecx with the pointer to storage for the return value
104
141
  movl 24(%ebp),%ecx
105
142
  fstpl (%ecx)
106
- jmp epilogue
143
+ jmp .Lepilogue
107
144
 
108
- retlongdouble:
109
- cmpl $FFI_TYPE_LONGDOUBLE,%ecx
110
- jne retint64
145
+ .Lretlongdouble:
111
146
  # Load %ecx with the pointer to storage for the return value
112
147
  movl 24(%ebp),%ecx
113
148
  fstpt (%ecx)
114
- jmp epilogue
149
+ jmp .Lepilogue
115
150
 
116
- retint64:
117
- cmpl $FFI_TYPE_SINT64,%ecx
118
- jne retstruct1b
151
+ .Lretint64:
119
152
  # Load %ecx with the pointer to storage for the return value
120
153
  movl 24(%ebp),%ecx
121
154
  movl %eax,0(%ecx)
122
155
  movl %edx,4(%ecx)
123
-
124
- retstruct1b:
125
- cmpl $FFI_TYPE_SINT8,%ecx
126
- jne retstruct2b
156
+ jmp .Lepilogue
157
+
158
+ .Lretstruct1b:
127
159
  # Load %ecx with the pointer to storage for the return value
128
160
  movl 24(%ebp),%ecx
129
161
  movb %al,0(%ecx)
130
- jmp epilogue
162
+ jmp .Lepilogue
131
163
 
132
- retstruct2b:
133
- cmpl $FFI_TYPE_SINT16,%ecx
134
- jne retstruct
164
+ .Lretstruct2b:
135
165
  # Load %ecx with the pointer to storage for the return value
136
166
  movl 24(%ebp),%ecx
137
167
  movw %ax,0(%ecx)
138
- jmp epilogue
139
-
140
- retstruct:
168
+ jmp .Lepilogue
169
+
170
+ .Lretstruct4b:
171
+ # Load %ecx with the pointer to storage for the return value
172
+ movl 24(%ebp),%ecx
173
+ movl %eax,0(%ecx)
174
+ jmp .Lepilogue
175
+
176
+ .Lretstruct:
141
177
  # Nothing to do!
142
178
 
143
- noretval:
144
- epilogue:
179
+ .Lnoretval:
180
+ .Lepilogue:
145
181
  movl %ebp,%esp
146
182
  popl %ebp
147
183
  ret
148
-
149
184
  .ffi_call_SYSV_end:
185
+ .LFE1:
150
186
 
151
187
  # This assumes we are using gas.
152
188
  .balign 16
153
- .globl _ffi_call_STDCALL
154
-
189
+ .globl _ffi_call_STDCALL
190
+ .def _ffi_call_STDCALL; .scl 2; .type 32; .endef
155
191
  _ffi_call_STDCALL:
192
+ .LFB2:
156
193
  pushl %ebp
194
+ .LCFI2:
157
195
  movl %esp,%ebp
158
-
196
+ .LCFI3:
159
197
  # Make room for all of the new args.
160
198
  movl 16(%ebp),%ecx
161
199
  subl %ecx,%esp
@@ -182,103 +220,133 @@ _ffi_call_STDCALL:
182
220
 
183
221
  # If the return value pointer is NULL, assume no return value.
184
222
  cmpl $0,24(%ebp)
185
- jne sc_retint
223
+ jne 0f
186
224
 
187
225
  # Even if there is no space for the return value, we are
188
226
  # obliged to handle floating-point values.
189
227
  cmpl $FFI_TYPE_FLOAT,%ecx
190
- jne sc_noretval
228
+ jne .Lsc_noretval
191
229
  fstp %st(0)
192
230
 
193
- jmp sc_epilogue
231
+ jmp .Lsc_epilogue
232
+
233
+ 0:
234
+ call 1f
235
+ # Do not insert anything here between the call and the jump table.
236
+ .Lsc_store_table:
237
+ .long .Lsc_noretval /* FFI_TYPE_VOID */
238
+ .long .Lsc_retint /* FFI_TYPE_INT */
239
+ .long .Lsc_retfloat /* FFI_TYPE_FLOAT */
240
+ .long .Lsc_retdouble /* FFI_TYPE_DOUBLE */
241
+ .long .Lsc_retlongdouble /* FFI_TYPE_LONGDOUBLE */
242
+ .long .Lsc_retuint8 /* FFI_TYPE_UINT8 */
243
+ .long .Lsc_retsint8 /* FFI_TYPE_SINT8 */
244
+ .long .Lsc_retuint16 /* FFI_TYPE_UINT16 */
245
+ .long .Lsc_retsint16 /* FFI_TYPE_SINT16 */
246
+ .long .Lsc_retint /* FFI_TYPE_UINT32 */
247
+ .long .Lsc_retint /* FFI_TYPE_SINT32 */
248
+ .long .Lsc_retint64 /* FFI_TYPE_UINT64 */
249
+ .long .Lsc_retint64 /* FFI_TYPE_SINT64 */
250
+ .long .Lsc_retstruct /* FFI_TYPE_STRUCT */
251
+ .long .Lsc_retint /* FFI_TYPE_POINTER */
252
+ .long .Lsc_retstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
253
+ .long .Lsc_retstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
254
+ .long .Lsc_retstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
255
+
256
+ 1:
257
+ add %ecx, %ecx
258
+ add %ecx, %ecx
259
+ add (%esp),%ecx
260
+ add $4, %esp
261
+ jmp *(%ecx)
262
+
263
+ /* Sign/zero extend as appropriate. */
264
+ .Lsc_retsint8:
265
+ movsbl %al, %eax
266
+ jmp .Lsc_retint
194
267
 
195
- sc_retint:
196
- cmpl $FFI_TYPE_INT,%ecx
197
- jne sc_retfloat
268
+ .Lsc_retsint16:
269
+ movswl %ax, %eax
270
+ jmp .Lsc_retint
271
+
272
+ .Lsc_retuint8:
273
+ movzbl %al, %eax
274
+ jmp .Lsc_retint
275
+
276
+ .Lsc_retuint16:
277
+ movzwl %ax, %eax
278
+ jmp .Lsc_retint
279
+
280
+ .Lsc_retint:
198
281
  # Load %ecx with the pointer to storage for the return value
199
282
  movl 24(%ebp),%ecx
200
283
  movl %eax,0(%ecx)
201
- jmp sc_epilogue
284
+ jmp .Lsc_epilogue
202
285
 
203
- sc_retfloat:
204
- cmpl $FFI_TYPE_FLOAT,%ecx
205
- jne sc_retdouble
286
+ .Lsc_retfloat:
206
287
  # Load %ecx with the pointer to storage for the return value
207
288
  movl 24(%ebp),%ecx
208
289
  fstps (%ecx)
209
- jmp sc_epilogue
290
+ jmp .Lsc_epilogue
210
291
 
211
- sc_retdouble:
212
- cmpl $FFI_TYPE_DOUBLE,%ecx
213
- jne sc_retlongdouble
292
+ .Lsc_retdouble:
214
293
  # Load %ecx with the pointer to storage for the return value
215
294
  movl 24(%ebp),%ecx
216
295
  fstpl (%ecx)
217
- jmp sc_epilogue
296
+ jmp .Lsc_epilogue
218
297
 
219
- sc_retlongdouble:
220
- cmpl $FFI_TYPE_LONGDOUBLE,%ecx
221
- jne sc_retint64
298
+ .Lsc_retlongdouble:
222
299
  # Load %ecx with the pointer to storage for the return value
223
300
  movl 24(%ebp),%ecx
224
301
  fstpt (%ecx)
225
- jmp sc_epilogue
302
+ jmp .Lsc_epilogue
226
303
 
227
- sc_retint64:
228
- cmpl $FFI_TYPE_SINT64,%ecx
229
- jne sc_retstruct1b
304
+ .Lsc_retint64:
230
305
  # Load %ecx with the pointer to storage for the return value
231
306
  movl 24(%ebp),%ecx
232
307
  movl %eax,0(%ecx)
233
308
  movl %edx,4(%ecx)
309
+ jmp .Lsc_epilogue
234
310
 
235
- sc_retstruct1b:
236
- cmpl $FFI_TYPE_SINT8,%ecx
237
- jne sc_retstruct2b
311
+ .Lsc_retstruct1b:
238
312
  # Load %ecx with the pointer to storage for the return value
239
313
  movl 24(%ebp),%ecx
240
314
  movb %al,0(%ecx)
241
- jmp sc_epilogue
315
+ jmp .Lsc_epilogue
242
316
 
243
- sc_retstruct2b:
244
- cmpl $FFI_TYPE_SINT16,%ecx
245
- jne sc_retstruct
317
+ .Lsc_retstruct2b:
246
318
  # Load %ecx with the pointer to storage for the return value
247
319
  movl 24(%ebp),%ecx
248
320
  movw %ax,0(%ecx)
249
- jmp sc_epilogue
321
+ jmp .Lsc_epilogue
250
322
 
251
- sc_retstruct:
323
+ .Lsc_retstruct4b:
324
+ # Load %ecx with the pointer to storage for the return value
325
+ movl 24(%ebp),%ecx
326
+ movl %eax,0(%ecx)
327
+ jmp .Lsc_epilogue
328
+
329
+ .Lsc_retstruct:
252
330
  # Nothing to do!
253
331
 
254
- sc_noretval:
255
- sc_epilogue:
332
+ .Lsc_noretval:
333
+ .Lsc_epilogue:
256
334
  movl %ebp,%esp
257
335
  popl %ebp
258
336
  ret
259
-
260
337
  .ffi_call_STDCALL_end:
338
+ .LFE2:
261
339
 
262
- .globl _ffi_closure_STDCALL
263
- _ffi_closure_STDCALL:
264
- pushl %ebp
265
- movl %esp, %ebp
266
- subl $40, %esp
267
- leal -24(%ebp), %edx
268
- movl %edx, -12(%ebp) /* resp */
269
- leal 12(%ebp), %edx /* account for stub return address on stack */
270
- movl %edx, 4(%esp) /* args */
271
- leal -12(%ebp), %edx
272
- movl %edx, (%esp) /* &resp */
273
- call _ffi_closure_SYSV_inner
274
- movl -12(%ebp), %ecx
275
- jmp .Lcls_return_result
276
- .ffi_closure_STDCALL_end:
277
-
278
- .globl _ffi_closure_SYSV
340
+ # This assumes we are using gas.
341
+ .balign 16
342
+ .globl _ffi_closure_SYSV
343
+ .def _ffi_closure_SYSV; .scl 2; .type 32; .endef
279
344
  _ffi_closure_SYSV:
345
+ .LFB3:
280
346
  pushl %ebp
347
+ .LCFI4:
281
348
  movl %esp, %ebp
349
+ .LCFI5:
282
350
  subl $40, %esp
283
351
  leal -24(%ebp), %edx
284
352
  movl %edx, -12(%ebp) /* resp */
@@ -288,48 +356,100 @@ _ffi_closure_SYSV:
288
356
  movl %edx, (%esp) /* &resp */
289
357
  call _ffi_closure_SYSV_inner
290
358
  movl -12(%ebp), %ecx
291
- .Lcls_return_result:
292
- cmpl $FFI_TYPE_INT, %eax
293
- je .Lcls_retint
294
- cmpl $FFI_TYPE_FLOAT, %eax
295
- je .Lcls_retfloat
296
- cmpl $FFI_TYPE_DOUBLE, %eax
297
- je .Lcls_retdouble
298
- cmpl $FFI_TYPE_LONGDOUBLE, %eax
299
- je .Lcls_retldouble
300
- cmpl $FFI_TYPE_SINT64, %eax
301
- je .Lcls_retllong
302
- cmpl $FFI_TYPE_SINT8, %eax /* 1-byte struct */
303
- je .Lcls_retstruct1
304
- cmpl $FFI_TYPE_SINT16, %eax /* 2-bytes struct */
305
- je .Lcls_retstruct2
306
- .Lcls_epilogue:
307
- movl %ebp, %esp
308
- popl %ebp
309
- ret
359
+
360
+ 0:
361
+ call 1f
362
+ # Do not insert anything here between the call and the jump table.
363
+ .Lcls_store_table:
364
+ .long .Lcls_noretval /* FFI_TYPE_VOID */
365
+ .long .Lcls_retint /* FFI_TYPE_INT */
366
+ .long .Lcls_retfloat /* FFI_TYPE_FLOAT */
367
+ .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */
368
+ .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */
369
+ .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */
370
+ .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */
371
+ .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */
372
+ .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */
373
+ .long .Lcls_retint /* FFI_TYPE_UINT32 */
374
+ .long .Lcls_retint /* FFI_TYPE_SINT32 */
375
+ .long .Lcls_retllong /* FFI_TYPE_UINT64 */
376
+ .long .Lcls_retllong /* FFI_TYPE_SINT64 */
377
+ .long .Lcls_retstruct /* FFI_TYPE_STRUCT */
378
+ .long .Lcls_retint /* FFI_TYPE_POINTER */
379
+ .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
380
+ .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
381
+ .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
382
+
383
+ 1:
384
+ add %eax, %eax
385
+ add %eax, %eax
386
+ add (%esp),%eax
387
+ add $4, %esp
388
+ jmp *(%eax)
389
+
390
+ /* Sign/zero extend as appropriate. */
391
+ .Lcls_retsint8:
392
+ movsbl (%ecx), %eax
393
+ jmp .Lcls_epilogue
394
+
395
+ .Lcls_retsint16:
396
+ movswl (%ecx), %eax
397
+ jmp .Lcls_epilogue
398
+
399
+ .Lcls_retuint8:
400
+ movzbl (%ecx), %eax
401
+ jmp .Lcls_epilogue
402
+
403
+ .Lcls_retuint16:
404
+ movzwl (%ecx), %eax
405
+ jmp .Lcls_epilogue
406
+
310
407
  .Lcls_retint:
311
408
  movl (%ecx), %eax
312
409
  jmp .Lcls_epilogue
410
+
313
411
  .Lcls_retfloat:
314
412
  flds (%ecx)
315
413
  jmp .Lcls_epilogue
414
+
316
415
  .Lcls_retdouble:
317
416
  fldl (%ecx)
318
417
  jmp .Lcls_epilogue
418
+
319
419
  .Lcls_retldouble:
320
420
  fldt (%ecx)
321
421
  jmp .Lcls_epilogue
422
+
322
423
  .Lcls_retllong:
323
424
  movl (%ecx), %eax
324
425
  movl 4(%ecx), %edx
325
426
  jmp .Lcls_epilogue
427
+
326
428
  .Lcls_retstruct1:
327
429
  movsbl (%ecx), %eax
328
430
  jmp .Lcls_epilogue
431
+
329
432
  .Lcls_retstruct2:
330
433
  movswl (%ecx), %eax
331
434
  jmp .Lcls_epilogue
435
+
436
+ .Lcls_retstruct4:
437
+ movl (%ecx), %eax
438
+ jmp .Lcls_epilogue
439
+
440
+ .Lcls_retstruct:
441
+ # Caller expects us to pop struct return value pointer hidden arg.
442
+ movl %ebp, %esp
443
+ popl %ebp
444
+ ret $0x4
445
+
446
+ .Lcls_noretval:
447
+ .Lcls_epilogue:
448
+ movl %ebp, %esp
449
+ popl %ebp
450
+ ret
332
451
  .ffi_closure_SYSV_end:
452
+ .LFE3:
333
453
 
334
454
  #if !FFI_NO_RAW_API
335
455
 
@@ -338,12 +458,18 @@ _ffi_closure_SYSV:
338
458
  #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
339
459
  #define CIF_FLAGS_OFFSET 20
340
460
 
341
- .balign 16
342
- .globl _ffi_closure_raw_SYSV
461
+ # This assumes we are using gas.
462
+ .balign 16
463
+ .globl _ffi_closure_raw_SYSV
464
+ .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
343
465
  _ffi_closure_raw_SYSV:
466
+ .LFB4:
344
467
  pushl %ebp
468
+ .LCFI6:
345
469
  movl %esp, %ebp
470
+ .LCFI7:
346
471
  pushl %esi
472
+ .LCFI8:
347
473
  subl $36, %esp
348
474
  movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
349
475
  movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
@@ -355,37 +481,397 @@ _ffi_closure_raw_SYSV:
355
481
  movl %esi, (%esp) /* cif */
356
482
  call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */
357
483
  movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */
358
- cmpl $FFI_TYPE_INT, %eax
359
- je .Lrcls_retint
360
- cmpl $FFI_TYPE_FLOAT, %eax
361
- je .Lrcls_retfloat
362
- cmpl $FFI_TYPE_DOUBLE, %eax
363
- je .Lrcls_retdouble
364
- cmpl $FFI_TYPE_LONGDOUBLE, %eax
365
- je .Lrcls_retldouble
366
- cmpl $FFI_TYPE_SINT64, %eax
367
- je .Lrcls_retllong
368
- .Lrcls_epilogue:
369
- addl $36, %esp
370
- popl %esi
371
- popl %ebp
372
- ret
484
+ 0:
485
+ call 1f
486
+ # Do not insert anything here between the call and the jump table.
487
+ .Lrcls_store_table:
488
+ .long .Lrcls_noretval /* FFI_TYPE_VOID */
489
+ .long .Lrcls_retint /* FFI_TYPE_INT */
490
+ .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */
491
+ .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */
492
+ .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */
493
+ .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */
494
+ .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */
495
+ .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */
496
+ .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */
497
+ .long .Lrcls_retint /* FFI_TYPE_UINT32 */
498
+ .long .Lrcls_retint /* FFI_TYPE_SINT32 */
499
+ .long .Lrcls_retllong /* FFI_TYPE_UINT64 */
500
+ .long .Lrcls_retllong /* FFI_TYPE_SINT64 */
501
+ .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */
502
+ .long .Lrcls_retint /* FFI_TYPE_POINTER */
503
+ .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
504
+ .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
505
+ .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
506
+ 1:
507
+ add %eax, %eax
508
+ add %eax, %eax
509
+ add (%esp),%eax
510
+ add $4, %esp
511
+ jmp *(%eax)
512
+
513
+ /* Sign/zero extend as appropriate. */
514
+ .Lrcls_retsint8:
515
+ movsbl -24(%ebp), %eax
516
+ jmp .Lrcls_epilogue
517
+
518
+ .Lrcls_retsint16:
519
+ movswl -24(%ebp), %eax
520
+ jmp .Lrcls_epilogue
521
+
522
+ .Lrcls_retuint8:
523
+ movzbl -24(%ebp), %eax
524
+ jmp .Lrcls_epilogue
525
+
526
+ .Lrcls_retuint16:
527
+ movzwl -24(%ebp), %eax
528
+ jmp .Lrcls_epilogue
529
+
373
530
  .Lrcls_retint:
374
531
  movl -24(%ebp), %eax
375
532
  jmp .Lrcls_epilogue
533
+
376
534
  .Lrcls_retfloat:
377
535
  flds -24(%ebp)
378
536
  jmp .Lrcls_epilogue
537
+
379
538
  .Lrcls_retdouble:
380
539
  fldl -24(%ebp)
381
540
  jmp .Lrcls_epilogue
541
+
382
542
  .Lrcls_retldouble:
383
543
  fldt -24(%ebp)
384
544
  jmp .Lrcls_epilogue
545
+
385
546
  .Lrcls_retllong:
386
547
  movl -24(%ebp), %eax
387
548
  movl -20(%ebp), %edx
388
549
  jmp .Lrcls_epilogue
550
+
551
+ .Lrcls_retstruct1:
552
+ movsbl -24(%ebp), %eax
553
+ jmp .Lrcls_epilogue
554
+
555
+ .Lrcls_retstruct2:
556
+ movswl -24(%ebp), %eax
557
+ jmp .Lrcls_epilogue
558
+
559
+ .Lrcls_retstruct4:
560
+ movl -24(%ebp), %eax
561
+ jmp .Lrcls_epilogue
562
+
563
+ .Lrcls_retstruct:
564
+ # Nothing to do!
565
+
566
+ .Lrcls_noretval:
567
+ .Lrcls_epilogue:
568
+ addl $36, %esp
569
+ popl %esi
570
+ popl %ebp
571
+ ret
389
572
  .ffi_closure_raw_SYSV_end:
573
+ .LFE4:
574
+
575
+ #endif /* !FFI_NO_RAW_API */
390
576
 
577
+ # This assumes we are using gas.
578
+ .balign 16
579
+ .globl _ffi_closure_STDCALL
580
+ .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
581
+ _ffi_closure_STDCALL:
582
+ .LFB5:
583
+ pushl %ebp
584
+ .LCFI9:
585
+ movl %esp, %ebp
586
+ .LCFI10:
587
+ subl $40, %esp
588
+ leal -24(%ebp), %edx
589
+ movl %edx, -12(%ebp) /* resp */
590
+ leal 12(%ebp), %edx /* account for stub return address on stack */
591
+ movl %edx, 4(%esp) /* args */
592
+ leal -12(%ebp), %edx
593
+ movl %edx, (%esp) /* &resp */
594
+ call _ffi_closure_SYSV_inner
595
+ movl -12(%ebp), %ecx
596
+ 0:
597
+ call 1f
598
+ # Do not insert anything here between the call and the jump table.
599
+ .Lscls_store_table:
600
+ .long .Lscls_noretval /* FFI_TYPE_VOID */
601
+ .long .Lscls_retint /* FFI_TYPE_INT */
602
+ .long .Lscls_retfloat /* FFI_TYPE_FLOAT */
603
+ .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */
604
+ .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */
605
+ .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */
606
+ .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */
607
+ .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */
608
+ .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */
609
+ .long .Lscls_retint /* FFI_TYPE_UINT32 */
610
+ .long .Lscls_retint /* FFI_TYPE_SINT32 */
611
+ .long .Lscls_retllong /* FFI_TYPE_UINT64 */
612
+ .long .Lscls_retllong /* FFI_TYPE_SINT64 */
613
+ .long .Lscls_retstruct /* FFI_TYPE_STRUCT */
614
+ .long .Lscls_retint /* FFI_TYPE_POINTER */
615
+ .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
616
+ .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
617
+ .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
618
+ 1:
619
+ add %eax, %eax
620
+ add %eax, %eax
621
+ add (%esp),%eax
622
+ add $4, %esp
623
+ jmp *(%eax)
624
+
625
+ /* Sign/zero extend as appropriate. */
626
+ .Lscls_retsint8:
627
+ movsbl (%ecx), %eax
628
+ jmp .Lscls_epilogue
629
+
630
+ .Lscls_retsint16:
631
+ movswl (%ecx), %eax
632
+ jmp .Lscls_epilogue
633
+
634
+ .Lscls_retuint8:
635
+ movzbl (%ecx), %eax
636
+ jmp .Lscls_epilogue
637
+
638
+ .Lscls_retuint16:
639
+ movzwl (%ecx), %eax
640
+ jmp .Lscls_epilogue
641
+
642
+ .Lscls_retint:
643
+ movl (%ecx), %eax
644
+ jmp .Lscls_epilogue
645
+
646
+ .Lscls_retfloat:
647
+ flds (%ecx)
648
+ jmp .Lscls_epilogue
649
+
650
+ .Lscls_retdouble:
651
+ fldl (%ecx)
652
+ jmp .Lscls_epilogue
653
+
654
+ .Lscls_retldouble:
655
+ fldt (%ecx)
656
+ jmp .Lscls_epilogue
657
+
658
+ .Lscls_retllong:
659
+ movl (%ecx), %eax
660
+ movl 4(%ecx), %edx
661
+ jmp .Lscls_epilogue
662
+
663
+ .Lscls_retstruct1:
664
+ movsbl (%ecx), %eax
665
+ jmp .Lscls_epilogue
666
+
667
+ .Lscls_retstruct2:
668
+ movswl (%ecx), %eax
669
+ jmp .Lscls_epilogue
670
+
671
+ .Lscls_retstruct4:
672
+ movl (%ecx), %eax
673
+ jmp .Lscls_epilogue
674
+
675
+ .Lscls_retstruct:
676
+ # Nothing to do!
677
+
678
+ .Lscls_noretval:
679
+ .Lscls_epilogue:
680
+ movl %ebp, %esp
681
+ popl %ebp
682
+ ret
683
+ .ffi_closure_STDCALL_end:
684
+ .LFE5:
685
+
686
+ .section .eh_frame,"w"
687
+ .Lframe1:
688
+ .LSCIE1:
689
+ .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
690
+ .LASCIE1:
691
+ .long 0x0 /* CIE Identifier Tag */
692
+ .byte 0x1 /* CIE Version */
693
+ #ifdef __PIC__
694
+ .ascii "zR\0" /* CIE Augmentation */
695
+ #else
696
+ .ascii "\0" /* CIE Augmentation */
697
+ #endif
698
+ .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
699
+ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
700
+ .byte 0x8 /* CIE RA Column */
701
+ #ifdef __PIC__
702
+ .byte 0x1 /* .uleb128 0x1; Augmentation size */
703
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
704
+ #endif
705
+ .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */
706
+ .byte 0x4 /* .uleb128 0x4 */
707
+ .byte 0x4 /* .uleb128 0x4 */
708
+ .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */
709
+ .byte 0x1 /* .uleb128 0x1 */
710
+ .align 4
711
+ .LECIE1:
712
+
713
+ .LSFDE1:
714
+ .long .LEFDE1-.LASFDE1 /* FDE Length */
715
+ .LASFDE1:
716
+ .long .LASFDE1-.Lframe1 /* FDE CIE offset */
717
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
718
+ .long .LFB1-. /* FDE initial location */
719
+ #else
720
+ .long .LFB1
721
+ #endif
722
+ .long .LFE1-.LFB1 /* FDE address range */
723
+ #ifdef __PIC__
724
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
725
+ #endif
726
+ /* DW_CFA_xxx CFI instructions go here. */
727
+
728
+ .byte 0x4 /* DW_CFA_advance_loc4 */
729
+ .long .LCFI0-.LFB1
730
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
731
+ .byte 0x8 /* .uleb128 0x8 */
732
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
733
+ .byte 0x2 /* .uleb128 0x2 */
734
+
735
+ .byte 0x4 /* DW_CFA_advance_loc4 */
736
+ .long .LCFI1-.LCFI0
737
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
738
+ .byte 0x5 /* .uleb128 0x5 */
739
+
740
+ /* End of DW_CFA_xxx CFI instructions. */
741
+ .align 4
742
+ .LEFDE1:
743
+
744
+
745
+ .LSFDE2:
746
+ .long .LEFDE2-.LASFDE2 /* FDE Length */
747
+ .LASFDE2:
748
+ .long .LASFDE2-.Lframe1 /* FDE CIE offset */
749
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
750
+ .long .LFB2-. /* FDE initial location */
751
+ #else
752
+ .long .LFB2
753
+ #endif
754
+ .long .LFE2-.LFB2 /* FDE address range */
755
+ #ifdef __PIC__
756
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
757
+ #endif
758
+ /* DW_CFA_xxx CFI instructions go here. */
759
+
760
+ .byte 0x4 /* DW_CFA_advance_loc4 */
761
+ .long .LCFI2-.LFB2
762
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
763
+ .byte 0x8 /* .uleb128 0x8 */
764
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
765
+ .byte 0x2 /* .uleb128 0x2 */
766
+
767
+ .byte 0x4 /* DW_CFA_advance_loc4 */
768
+ .long .LCFI3-.LCFI2
769
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
770
+ .byte 0x5 /* .uleb128 0x5 */
771
+
772
+ /* End of DW_CFA_xxx CFI instructions. */
773
+ .align 4
774
+ .LEFDE2:
775
+
776
+
777
+ .LSFDE3:
778
+ .long .LEFDE3-.LASFDE3 /* FDE Length */
779
+ .LASFDE3:
780
+ .long .LASFDE3-.Lframe1 /* FDE CIE offset */
781
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
782
+ .long .LFB3-. /* FDE initial location */
783
+ #else
784
+ .long .LFB3
785
+ #endif
786
+ .long .LFE3-.LFB3 /* FDE address range */
787
+ #ifdef __PIC__
788
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
789
+ #endif
790
+ /* DW_CFA_xxx CFI instructions go here. */
791
+
792
+ .byte 0x4 /* DW_CFA_advance_loc4 */
793
+ .long .LCFI4-.LFB3
794
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
795
+ .byte 0x8 /* .uleb128 0x8 */
796
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
797
+ .byte 0x2 /* .uleb128 0x2 */
798
+
799
+ .byte 0x4 /* DW_CFA_advance_loc4 */
800
+ .long .LCFI5-.LCFI4
801
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
802
+ .byte 0x5 /* .uleb128 0x5 */
803
+
804
+ /* End of DW_CFA_xxx CFI instructions. */
805
+ .align 4
806
+ .LEFDE3:
807
+
808
+ #if !FFI_NO_RAW_API
809
+
810
+ .LSFDE4:
811
+ .long .LEFDE4-.LASFDE4 /* FDE Length */
812
+ .LASFDE4:
813
+ .long .LASFDE4-.Lframe1 /* FDE CIE offset */
814
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
815
+ .long .LFB4-. /* FDE initial location */
816
+ #else
817
+ .long .LFB4
391
818
  #endif
819
+ .long .LFE4-.LFB4 /* FDE address range */
820
+ #ifdef __PIC__
821
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
822
+ #endif
823
+ /* DW_CFA_xxx CFI instructions go here. */
824
+
825
+ .byte 0x4 /* DW_CFA_advance_loc4 */
826
+ .long .LCFI6-.LFB4
827
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
828
+ .byte 0x8 /* .uleb128 0x8 */
829
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
830
+ .byte 0x2 /* .uleb128 0x2 */
831
+
832
+ .byte 0x4 /* DW_CFA_advance_loc4 */
833
+ .long .LCFI7-.LCFI6
834
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
835
+ .byte 0x5 /* .uleb128 0x5 */
836
+
837
+ .byte 0x4 /* DW_CFA_advance_loc4 */
838
+ .long .LCFI8-.LCFI7
839
+ .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */
840
+ .byte 0x3 /* .uleb128 0x3 */
841
+
842
+ /* End of DW_CFA_xxx CFI instructions. */
843
+ .align 4
844
+ .LEFDE4:
845
+
846
+ #endif /* !FFI_NO_RAW_API */
847
+
848
+ .LSFDE5:
849
+ .long .LEFDE5-.LASFDE5 /* FDE Length */
850
+ .LASFDE5:
851
+ .long .LASFDE5-.Lframe1 /* FDE CIE offset */
852
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
853
+ .long .LFB5-. /* FDE initial location */
854
+ #else
855
+ .long .LFB5
856
+ #endif
857
+ .long .LFE5-.LFB5 /* FDE address range */
858
+ #ifdef __PIC__
859
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
860
+ #endif
861
+ /* DW_CFA_xxx CFI instructions go here. */
862
+
863
+ .byte 0x4 /* DW_CFA_advance_loc4 */
864
+ .long .LCFI9-.LFB5
865
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
866
+ .byte 0x8 /* .uleb128 0x8 */
867
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
868
+ .byte 0x2 /* .uleb128 0x2 */
869
+
870
+ .byte 0x4 /* DW_CFA_advance_loc4 */
871
+ .long .LCFI10-.LCFI9
872
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
873
+ .byte 0x5 /* .uleb128 0x5 */
874
+
875
+ /* End of DW_CFA_xxx CFI instructions. */
876
+ .align 4
877
+ .LEFDE5: