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.
- data/LICENSE +1 -27
- data/Rakefile +9 -12
- data/ext/ffi_c/AbstractMemory.c +11 -8
- data/ext/ffi_c/AbstractMemory.h +23 -21
- data/ext/ffi_c/AutoPointer.c +0 -1
- data/ext/ffi_c/Buffer.c +24 -8
- data/ext/ffi_c/Call.c +28 -0
- data/ext/ffi_c/Call.h +8 -4
- data/ext/ffi_c/ClosurePool.c +7 -5
- data/ext/ffi_c/DynamicLibrary.c +0 -1
- data/ext/ffi_c/Function.c +19 -2
- data/ext/ffi_c/MemoryPointer.c +3 -3
- data/ext/ffi_c/MethodHandle.c +1 -1
- data/ext/ffi_c/Pointer.c +23 -9
- data/ext/ffi_c/Struct.c +142 -69
- data/ext/ffi_c/Struct.h +16 -7
- data/ext/ffi_c/StructLayout.c +92 -55
- data/ext/ffi_c/Type.c +5 -22
- data/ext/ffi_c/Type.h +1 -1
- data/ext/ffi_c/Types.c +8 -2
- data/ext/ffi_c/Types.h +2 -0
- data/ext/ffi_c/Variadic.c +7 -19
- data/ext/ffi_c/endian.h +1 -1
- data/ext/ffi_c/extconf.rb +20 -11
- data/ext/ffi_c/libffi/ChangeLog +900 -84
- data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +14 -4
- data/ext/ffi_c/libffi/Makefile.in +362 -211
- data/ext/ffi_c/libffi/README +70 -92
- data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
- data/ext/ffi_c/libffi/config.guess +125 -143
- data/ext/ffi_c/libffi/config.sub +103 -27
- data/ext/ffi_c/libffi/configure +11364 -18497
- data/ext/ffi_c/libffi/configure.ac +43 -4
- data/ext/ffi_c/libffi/doc/libffi.info +15 -15
- data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
- data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
- data/ext/ffi_c/libffi/include/Makefile.am +1 -1
- data/ext/ffi_c/libffi/include/Makefile.in +97 -50
- data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
- data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
- data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
- data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
- data/ext/ffi_c/libffi/man/Makefile.in +115 -62
- data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
- data/ext/ffi_c/libffi/missing +15 -8
- data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
- data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
- data/ext/ffi_c/libffi/src/closures.c +47 -10
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
- data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
- data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
- data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
- data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
- data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
- data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
- data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
- data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
- data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
- data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
- data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
- data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
- data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
- data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
- data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
- data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
- data/ext/ffi_c/libffi/texinfo.tex +155 -427
- data/ext/ffi_c/libffi.bsd.mk +1 -1
- data/lib/ffi/autopointer.rb +79 -20
- data/lib/ffi/buffer.rb +4 -0
- data/lib/ffi/callback.rb +4 -10
- data/lib/ffi/enum.rb +28 -0
- data/lib/ffi/ffi.rb +0 -1
- data/lib/ffi/io.rb +28 -0
- data/lib/ffi/library.rb +237 -182
- data/lib/ffi/memorypointer.rb +28 -62
- data/lib/ffi/platform.rb +27 -0
- data/lib/ffi/pointer.rb +28 -0
- data/lib/ffi/struct.rb +55 -1
- data/lib/ffi/types.rb +29 -0
- data/lib/ffi/variadic.rb +29 -0
- data/spec/ffi/library_spec.rb +31 -5
- data/spec/ffi/managed_struct_spec.rb +1 -1
- data/spec/ffi/pointer_spec.rb +1 -1
- data/spec/ffi/rbx/attach_function_spec.rb +2 -1
- data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
- data/spec/ffi/spec_helper.rb +5 -1
- data/spec/ffi/struct_spec.rb +77 -0
- metadata +28 -18
- data/ext/ffi_c/libffi/TODO +0 -1
- data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
- data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
- data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
- data/ext/ffi_c/libffi/ltconfig +0 -2862
- 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,
|
|
21
|
-
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
22
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
23
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
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
|
|
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
|
|
76
|
+
jne .Lnoretval
|
|
80
77
|
fstp %st(0)
|
|
81
78
|
|
|
82
|
-
jmp
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
131
|
+
jmp .Lepilogue
|
|
91
132
|
|
|
92
|
-
|
|
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
|
|
137
|
+
jmp .Lepilogue
|
|
99
138
|
|
|
100
|
-
|
|
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
|
|
143
|
+
jmp .Lepilogue
|
|
107
144
|
|
|
108
|
-
|
|
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
|
|
149
|
+
jmp .Lepilogue
|
|
115
150
|
|
|
116
|
-
|
|
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
|
-
|
|
125
|
-
|
|
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
|
|
162
|
+
jmp .Lepilogue
|
|
131
163
|
|
|
132
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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
|
|
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
|
|
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
|
|
228
|
+
jne .Lsc_noretval
|
|
191
229
|
fstp %st(0)
|
|
192
230
|
|
|
193
|
-
jmp
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
|
284
|
+
jmp .Lsc_epilogue
|
|
202
285
|
|
|
203
|
-
|
|
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
|
|
290
|
+
jmp .Lsc_epilogue
|
|
210
291
|
|
|
211
|
-
|
|
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
|
|
296
|
+
jmp .Lsc_epilogue
|
|
218
297
|
|
|
219
|
-
|
|
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
|
|
302
|
+
jmp .Lsc_epilogue
|
|
226
303
|
|
|
227
|
-
|
|
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
|
-
|
|
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
|
|
315
|
+
jmp .Lsc_epilogue
|
|
242
316
|
|
|
243
|
-
|
|
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
|
|
321
|
+
jmp .Lsc_epilogue
|
|
250
322
|
|
|
251
|
-
|
|
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
|
-
|
|
255
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
.
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
-
|
|
342
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
.
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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:
|