ffi 0.5.4-x86-mingw32 → 0.6.3-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- data/History.txt +102 -0
- data/LICENSE +1 -27
- data/Rakefile +4 -12
- data/ext/ffi_c/AbstractMemory.c +6 -8
- data/ext/ffi_c/AbstractMemory.h +23 -21
- data/ext/ffi_c/AutoPointer.c +0 -1
- data/ext/ffi_c/Buffer.c +23 -8
- data/ext/ffi_c/Call.c +31 -3
- data/ext/ffi_c/Call.h +5 -1
- data/ext/ffi_c/DynamicLibrary.c +0 -1
- data/ext/ffi_c/Function.c +22 -4
- data/ext/ffi_c/MemoryPointer.c +2 -3
- data/ext/ffi_c/Pointer.c +23 -9
- data/ext/ffi_c/Struct.c +227 -79
- 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 +9 -3
- data/ext/ffi_c/Types.h +2 -0
- data/ext/ffi_c/extconf.rb +11 -7
- data/ext/ffi_c/libffi.gnu.mk +1 -1
- data/ext/ffi_c/libffi.mk +1 -1
- 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 +11340 -18473
- 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/gen/Rakefile +4 -2
- data/lib/1.8/ffi_c.so +0 -0
- data/lib/1.9/ffi_c.so +0 -0
- data/lib/ffi/autopointer.rb +79 -20
- data/lib/ffi/callback.rb +4 -10
- data/lib/ffi/enum.rb +28 -0
- data/lib/ffi/ffi.rb +1 -0
- 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/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 +82 -0
- data/tasks/ann.rake +80 -0
- data/tasks/extension.rake +25 -0
- data/tasks/gem.rake +200 -0
- data/tasks/git.rake +41 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +50 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +300 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- metadata +312 -279
- 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,6 +1,6 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
|
3
|
-
|
2
|
+
ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
|
3
|
+
Copyright (c) 2008 Red Hat, Inc.
|
4
4
|
|
5
5
|
x86-64 Foreign Function Interface
|
6
6
|
|
@@ -145,13 +145,35 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
145
145
|
case FFI_TYPE_UINT64:
|
146
146
|
case FFI_TYPE_SINT64:
|
147
147
|
case FFI_TYPE_POINTER:
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
148
|
+
{
|
149
|
+
int size = byte_offset + type->size;
|
150
|
+
|
151
|
+
if (size <= 4)
|
152
|
+
{
|
153
|
+
classes[0] = X86_64_INTEGERSI_CLASS;
|
154
|
+
return 1;
|
155
|
+
}
|
156
|
+
else if (size <= 8)
|
157
|
+
{
|
158
|
+
classes[0] = X86_64_INTEGER_CLASS;
|
159
|
+
return 1;
|
160
|
+
}
|
161
|
+
else if (size <= 12)
|
162
|
+
{
|
163
|
+
classes[0] = X86_64_INTEGER_CLASS;
|
164
|
+
classes[1] = X86_64_INTEGERSI_CLASS;
|
165
|
+
return 2;
|
166
|
+
}
|
167
|
+
else if (size <= 16)
|
168
|
+
{
|
169
|
+
classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
|
170
|
+
return 2;
|
171
|
+
}
|
172
|
+
else
|
173
|
+
FFI_ASSERT (0);
|
174
|
+
}
|
153
175
|
case FFI_TYPE_FLOAT:
|
154
|
-
if (byte_offset
|
176
|
+
if (!(byte_offset % 8))
|
155
177
|
classes[0] = X86_64_SSESF_CLASS;
|
156
178
|
else
|
157
179
|
classes[0] = X86_64_SSE_CLASS;
|
@@ -171,13 +193,21 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
171
193
|
int i;
|
172
194
|
enum x86_64_reg_class subclasses[MAX_CLASSES];
|
173
195
|
|
174
|
-
/* If the struct is larger than
|
175
|
-
if (type->size >
|
196
|
+
/* If the struct is larger than 32 bytes, pass it on the stack. */
|
197
|
+
if (type->size > 32)
|
176
198
|
return 0;
|
177
199
|
|
178
200
|
for (i = 0; i < words; i++)
|
179
201
|
classes[i] = X86_64_NO_CLASS;
|
180
202
|
|
203
|
+
/* Zero sized arrays or structures are NO_CLASS. We return 0 to
|
204
|
+
signalize memory class, so handle it as special case. */
|
205
|
+
if (!words)
|
206
|
+
{
|
207
|
+
classes[0] = X86_64_NO_CLASS;
|
208
|
+
return 1;
|
209
|
+
}
|
210
|
+
|
181
211
|
/* Merge the fields of structure. */
|
182
212
|
for (ptr = type->elements; *ptr != NULL; ptr++)
|
183
213
|
{
|
@@ -198,6 +228,20 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
198
228
|
byte_offset += (*ptr)->size;
|
199
229
|
}
|
200
230
|
|
231
|
+
if (words > 2)
|
232
|
+
{
|
233
|
+
/* When size > 16 bytes, if the first one isn't
|
234
|
+
X86_64_SSE_CLASS or any other ones aren't
|
235
|
+
X86_64_SSEUP_CLASS, everything should be passed in
|
236
|
+
memory. */
|
237
|
+
if (classes[0] != X86_64_SSE_CLASS)
|
238
|
+
return 0;
|
239
|
+
|
240
|
+
for (i = 1; i < words; i++)
|
241
|
+
if (classes[i] != X86_64_SSEUP_CLASS)
|
242
|
+
return 0;
|
243
|
+
}
|
244
|
+
|
201
245
|
/* Final merger cleanup. */
|
202
246
|
for (i = 0; i < words; i++)
|
203
247
|
{
|
@@ -207,15 +251,25 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
207
251
|
return 0;
|
208
252
|
|
209
253
|
/* The X86_64_SSEUP_CLASS should be always preceded by
|
210
|
-
X86_64_SSE_CLASS. */
|
254
|
+
X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
|
211
255
|
if (classes[i] == X86_64_SSEUP_CLASS
|
212
|
-
&&
|
213
|
-
|
256
|
+
&& classes[i - 1] != X86_64_SSE_CLASS
|
257
|
+
&& classes[i - 1] != X86_64_SSEUP_CLASS)
|
258
|
+
{
|
259
|
+
/* The first one should never be X86_64_SSEUP_CLASS. */
|
260
|
+
FFI_ASSERT (i != 0);
|
261
|
+
classes[i] = X86_64_SSE_CLASS;
|
262
|
+
}
|
214
263
|
|
215
|
-
/* X86_64_X87UP_CLASS
|
264
|
+
/* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
|
265
|
+
everything should be passed in memory. */
|
216
266
|
if (classes[i] == X86_64_X87UP_CLASS
|
217
|
-
&& (
|
218
|
-
|
267
|
+
&& (classes[i - 1] != X86_64_X87_CLASS))
|
268
|
+
{
|
269
|
+
/* The first one should never be X86_64_X87UP_CLASS. */
|
270
|
+
FFI_ASSERT (i != 0);
|
271
|
+
return 0;
|
272
|
+
}
|
219
273
|
}
|
220
274
|
return words;
|
221
275
|
}
|
@@ -528,10 +582,10 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
|
|
528
582
|
argp += arg_types[i]->size;
|
529
583
|
}
|
530
584
|
/* If the argument is in a single register, or two consecutive
|
531
|
-
registers, then we can use that address directly. */
|
585
|
+
integer registers, then we can use that address directly. */
|
532
586
|
else if (n == 1
|
533
|
-
|| (n == 2
|
534
|
-
|
587
|
+
|| (n == 2 && !(SSE_CLASS_P (classes[0])
|
588
|
+
|| SSE_CLASS_P (classes[1]))))
|
535
589
|
{
|
536
590
|
/* The argument is in a single register. */
|
537
591
|
if (SSE_CLASS_P (classes[0]))
|
@@ -36,11 +36,26 @@
|
|
36
36
|
#define X86
|
37
37
|
#endif
|
38
38
|
|
39
|
+
#ifdef X86_WIN64
|
40
|
+
#define FFI_SIZEOF_ARG 8
|
41
|
+
#define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64
|
42
|
+
#endif
|
43
|
+
|
39
44
|
/* ---- Generic type definitions ----------------------------------------- */
|
40
45
|
|
41
46
|
#ifndef LIBFFI_ASM
|
47
|
+
#ifdef X86_WIN64
|
48
|
+
#ifdef _MSC_VER
|
49
|
+
typedef unsigned __int64 ffi_arg;
|
50
|
+
typedef __int64 ffi_sarg;
|
51
|
+
#else
|
52
|
+
typedef unsigned long long ffi_arg;
|
53
|
+
typedef long long ffi_sarg;
|
54
|
+
#endif
|
55
|
+
#else
|
42
56
|
typedef unsigned long ffi_arg;
|
43
57
|
typedef signed long ffi_sarg;
|
58
|
+
#endif
|
44
59
|
|
45
60
|
typedef enum ffi_abi {
|
46
61
|
FFI_FIRST_ABI = 0,
|
@@ -53,6 +68,11 @@ typedef enum ffi_abi {
|
|
53
68
|
FFI_DEFAULT_ABI = FFI_SYSV,
|
54
69
|
#endif
|
55
70
|
|
71
|
+
#ifdef X86_WIN64
|
72
|
+
FFI_WIN64,
|
73
|
+
FFI_DEFAULT_ABI = FFI_WIN64,
|
74
|
+
#else
|
75
|
+
|
56
76
|
/* ---- Intel x86 and AMD x86-64 - */
|
57
77
|
#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
|
58
78
|
FFI_SYSV,
|
@@ -63,6 +83,7 @@ typedef enum ffi_abi {
|
|
63
83
|
FFI_DEFAULT_ABI = FFI_UNIX64,
|
64
84
|
#endif
|
65
85
|
#endif
|
86
|
+
#endif /* X86_WIN64 */
|
66
87
|
|
67
88
|
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
|
68
89
|
} ffi_abi;
|
@@ -73,6 +94,7 @@ typedef enum ffi_abi {
|
|
73
94
|
#define FFI_CLOSURES 1
|
74
95
|
#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
|
75
96
|
#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
|
97
|
+
#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
|
76
98
|
|
77
99
|
#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
|
78
100
|
#define FFI_TRAMPOLINE_SIZE 24
|
@@ -81,10 +103,18 @@ typedef enum ffi_abi {
|
|
81
103
|
#ifdef X86_WIN32
|
82
104
|
#define FFI_TRAMPOLINE_SIZE 13
|
83
105
|
#else
|
106
|
+
#ifdef X86_WIN64
|
107
|
+
#define FFI_TRAMPOLINE_SIZE 29
|
108
|
+
#define FFI_NATIVE_RAW_API 0
|
109
|
+
#define FFI_NO_RAW_API 1
|
110
|
+
#else
|
84
111
|
#define FFI_TRAMPOLINE_SIZE 10
|
85
112
|
#endif
|
113
|
+
#endif
|
114
|
+
#ifndef X86_WIN64
|
86
115
|
#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
|
87
116
|
#endif
|
117
|
+
#endif
|
88
118
|
|
89
119
|
#endif
|
90
120
|
|
@@ -242,9 +242,20 @@ ffi_closure_SYSV:
|
|
242
242
|
|
243
243
|
#if !FFI_NO_RAW_API
|
244
244
|
|
245
|
+
/* Precalculate for e.g. the Solaris 10/x86 assembler. */
|
246
|
+
#if FFI_TRAMPOLINE_SIZE == 10
|
247
|
+
#define RAW_CLOSURE_CIF_OFFSET 12
|
248
|
+
#define RAW_CLOSURE_FUN_OFFSET 16
|
249
|
+
#define RAW_CLOSURE_USER_DATA_OFFSET 20
|
250
|
+
#elif FFI_TRAMPOLINE_SIZE == 24
|
251
|
+
#define RAW_CLOSURE_CIF_OFFSET 24
|
252
|
+
#define RAW_CLOSURE_FUN_OFFSET 28
|
253
|
+
#define RAW_CLOSURE_USER_DATA_OFFSET 32
|
254
|
+
#else
|
245
255
|
#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
|
246
256
|
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
|
247
257
|
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
|
258
|
+
#endif
|
248
259
|
#define CIF_FLAGS_OFFSET 20
|
249
260
|
|
250
261
|
.align 4
|
@@ -343,10 +354,12 @@ ffi_closure_raw_SYSV:
|
|
343
354
|
.long .LEFDE1-.LASFDE1 /* FDE Length */
|
344
355
|
.LASFDE1:
|
345
356
|
.long .LASFDE1-.Lframe1 /* FDE CIE offset */
|
346
|
-
#
|
357
|
+
#if defined __PIC__ && defined HAVE_AS_X86_PCREL
|
347
358
|
.long .LFB1-. /* FDE initial location */
|
359
|
+
#elif defined __PIC__
|
360
|
+
.long .LFB1@rel
|
348
361
|
#else
|
349
|
-
.long .LFB1
|
362
|
+
.long .LFB1
|
350
363
|
#endif
|
351
364
|
.long .LFE1-.LFB1 /* FDE address range */
|
352
365
|
#ifdef __PIC__
|
@@ -368,8 +381,10 @@ ffi_closure_raw_SYSV:
|
|
368
381
|
.long .LEFDE2-.LASFDE2 /* FDE Length */
|
369
382
|
.LASFDE2:
|
370
383
|
.long .LASFDE2-.Lframe1 /* FDE CIE offset */
|
371
|
-
#
|
384
|
+
#if defined __PIC__ && defined HAVE_AS_X86_PCREL
|
372
385
|
.long .LFB2-. /* FDE initial location */
|
386
|
+
#elif defined __PIC__
|
387
|
+
.long .LFB2@rel
|
373
388
|
#else
|
374
389
|
.long .LFB2
|
375
390
|
#endif
|
@@ -402,8 +417,10 @@ ffi_closure_raw_SYSV:
|
|
402
417
|
.long .LEFDE3-.LASFDE3 /* FDE Length */
|
403
418
|
.LASFDE3:
|
404
419
|
.long .LASFDE3-.Lframe1 /* FDE CIE offset */
|
405
|
-
#
|
420
|
+
#if defined __PIC__ && defined HAVE_AS_X86_PCREL
|
406
421
|
.long .LFB3-. /* FDE initial location */
|
422
|
+
#elif defined __PIC__
|
423
|
+
.long .LFB3@rel
|
407
424
|
#else
|
408
425
|
.long .LFB3
|
409
426
|
#endif
|
@@ -89,7 +89,6 @@ ffi_call_unix64:
|
|
89
89
|
addq %r11, %r10
|
90
90
|
jmp *%r10
|
91
91
|
|
92
|
-
.section .rodata
|
93
92
|
.Lstore_table:
|
94
93
|
.long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */
|
95
94
|
.long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */
|
@@ -107,7 +106,6 @@ ffi_call_unix64:
|
|
107
106
|
.long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
|
108
107
|
.long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
|
109
108
|
|
110
|
-
.text
|
111
109
|
.align 2
|
112
110
|
.Lst_void:
|
113
111
|
ret
|
@@ -240,7 +238,6 @@ ffi_closure_unix64:
|
|
240
238
|
addq %r11, %r10
|
241
239
|
jmp *%r10
|
242
240
|
|
243
|
-
.section .rodata
|
244
241
|
.Lload_table:
|
245
242
|
.long .Lld_void-.Lload_table /* FFI_TYPE_VOID */
|
246
243
|
.long .Lld_int32-.Lload_table /* FFI_TYPE_INT */
|
@@ -258,7 +255,6 @@ ffi_closure_unix64:
|
|
258
255
|
.long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
|
259
256
|
.long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
|
260
257
|
|
261
|
-
.text
|
262
258
|
.align 2
|
263
259
|
.Lld_void:
|
264
260
|
ret
|
@@ -351,7 +347,11 @@ ffi_closure_unix64:
|
|
351
347
|
.long .LEFDE1-.LASFDE1 /* FDE Length */
|
352
348
|
.LASFDE1:
|
353
349
|
.long .LASFDE1-.Lframe1 /* FDE CIE offset */
|
350
|
+
#if HAVE_AS_X86_PCREL
|
354
351
|
.long .LUW0-. /* FDE initial location */
|
352
|
+
#else
|
353
|
+
.long .LUW0@rel
|
354
|
+
#endif
|
355
355
|
.long .LUW4-.LUW0 /* FDE address range */
|
356
356
|
.uleb128 0x0 /* Augmentation size */
|
357
357
|
|
@@ -389,7 +389,11 @@ ffi_closure_unix64:
|
|
389
389
|
.long .LEFDE3-.LASFDE3 /* FDE Length */
|
390
390
|
.LASFDE3:
|
391
391
|
.long .LASFDE3-.Lframe1 /* FDE CIE offset */
|
392
|
+
#if HAVE_AS_X86_PCREL
|
392
393
|
.long .LUW5-. /* FDE initial location */
|
394
|
+
#else
|
395
|
+
.long .LUW5@rel
|
396
|
+
#endif
|
393
397
|
.long .LUW9-.LUW5 /* FDE address range */
|
394
398
|
.uleb128 0x0 /* Augmentation size */
|
395
399
|
|
@@ -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:
|