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,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
|
|