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
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
The above copyright notice and this permission notice shall be included
|
|
15
15
|
in all copies or substantial portions of the Software.
|
|
16
16
|
|
|
17
|
-
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
-
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
21
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
22
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
24
|
+
DEALINGS IN THE SOFTWARE.
|
|
25
25
|
----------------------------------------------------------------------- */
|
|
26
26
|
|
|
27
27
|
#define LIBFFI_ASM
|
|
@@ -492,6 +492,13 @@ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
|
|
|
492
492
|
avalue[i] = (void *)(stack - slot);
|
|
493
493
|
break;
|
|
494
494
|
|
|
495
|
+
#ifdef PA_HPUX
|
|
496
|
+
case FFI_TYPE_LONGDOUBLE:
|
|
497
|
+
/* Long doubles are treated like a big structure. */
|
|
498
|
+
avalue[i] = (void *) *(stack - slot);
|
|
499
|
+
break;
|
|
500
|
+
#endif
|
|
501
|
+
|
|
495
502
|
case FFI_TYPE_STRUCT:
|
|
496
503
|
/* Structs smaller or equal than 4 bytes are passed in one
|
|
497
504
|
register. Structs smaller or equal 8 bytes are passed in two
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* -----------------------------------------------------------------------
|
|
2
|
-
aix.S - Copyright (c) 2002 Free Software Foundation, Inc.
|
|
2
|
+
aix.S - Copyright (c) 2002,2009 Free Software Foundation, Inc.
|
|
3
3
|
based on darwin.S by John Hornkvist
|
|
4
4
|
|
|
5
5
|
PowerPC Assembly glue.
|
|
@@ -86,9 +86,13 @@
|
|
|
86
86
|
#define L(x) x
|
|
87
87
|
.file "aix.S"
|
|
88
88
|
.toc
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
|
|
90
|
+
/* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes,
|
|
91
|
+
* unsigned int flags, unsigned int *rvalue,
|
|
92
|
+
* void (*fn)(),
|
|
93
|
+
* void (*prep_args)(extended_cif*, unsigned *const));
|
|
94
|
+
* r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args
|
|
95
|
+
*/
|
|
92
96
|
|
|
93
97
|
.csect .text[PR]
|
|
94
98
|
.align 2
|
|
@@ -96,61 +100,151 @@
|
|
|
96
100
|
.globl .ffi_call_AIX
|
|
97
101
|
.csect ffi_call_AIX[DS]
|
|
98
102
|
ffi_call_AIX:
|
|
99
|
-
|
|
103
|
+
#ifdef __64BIT__
|
|
104
|
+
.llong .ffi_call_AIX, TOC[tc0], 0
|
|
100
105
|
.csect .text[PR]
|
|
101
106
|
.ffi_call_AIX:
|
|
102
|
-
mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
|
|
103
|
-
/* Save the old stack pointer as AP. */
|
|
104
|
-
mr r8,r1
|
|
105
|
-
|
|
106
|
-
/* Allocate the stack space we need. */
|
|
107
|
-
stwux r1,r1,r4
|
|
108
|
-
|
|
109
107
|
/* Save registers we use. */
|
|
110
|
-
mflr
|
|
108
|
+
mflr r0
|
|
111
109
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
std r28,-32(r1)
|
|
111
|
+
std r29,-24(r1)
|
|
112
|
+
std r30,-16(r1)
|
|
113
|
+
std r31, -8(r1)
|
|
116
114
|
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
std r0, 16(r1)
|
|
116
|
+
mr r28, r1 /* our AP. */
|
|
117
|
+
stdux r1, r1, r4
|
|
119
118
|
|
|
120
119
|
/* Save arguments over call... */
|
|
121
|
-
mr r31,r5 /* flags, */
|
|
122
|
-
mr r30,r6 /* rvalue, */
|
|
123
|
-
mr r29,r7 /* function address
|
|
124
|
-
|
|
120
|
+
mr r31, r5 /* flags, */
|
|
121
|
+
mr r30, r6 /* rvalue, */
|
|
122
|
+
mr r29, r7 /* function address. */
|
|
123
|
+
std r2, 40(r1)
|
|
125
124
|
|
|
126
125
|
/* Call ffi_prep_args. */
|
|
127
|
-
mr r4,r1
|
|
128
|
-
|
|
126
|
+
mr r4, r1
|
|
127
|
+
bl .ffi_prep_args
|
|
128
|
+
|
|
129
|
+
/* Now do the call. */
|
|
130
|
+
ld r0, 0(r29)
|
|
131
|
+
ld r2, 8(r29)
|
|
132
|
+
ld r11, 16(r29)
|
|
133
|
+
/* Set up cr1 with bits 4-7 of the flags. */
|
|
134
|
+
mtcrf 0x40, r31
|
|
135
|
+
mtctr r0
|
|
136
|
+
/* Load all those argument registers. */
|
|
137
|
+
// We have set up a nice stack frame, just load it into registers.
|
|
138
|
+
ld r3, 40+(1*8)(r1)
|
|
139
|
+
ld r4, 40+(2*8)(r1)
|
|
140
|
+
ld r5, 40+(3*8)(r1)
|
|
141
|
+
ld r6, 40+(4*8)(r1)
|
|
142
|
+
nop
|
|
143
|
+
ld r7, 40+(5*8)(r1)
|
|
144
|
+
ld r8, 40+(6*8)(r1)
|
|
145
|
+
ld r9, 40+(7*8)(r1)
|
|
146
|
+
ld r10,40+(8*8)(r1)
|
|
147
|
+
|
|
148
|
+
L1:
|
|
149
|
+
/* Load all the FP registers. */
|
|
150
|
+
bf 6,L2 // 2f + 0x18
|
|
151
|
+
lfd f1,-32-(13*8)(r28)
|
|
152
|
+
lfd f2,-32-(12*8)(r28)
|
|
153
|
+
lfd f3,-32-(11*8)(r28)
|
|
154
|
+
lfd f4,-32-(10*8)(r28)
|
|
155
|
+
nop
|
|
156
|
+
lfd f5,-32-(9*8)(r28)
|
|
157
|
+
lfd f6,-32-(8*8)(r28)
|
|
158
|
+
lfd f7,-32-(7*8)(r28)
|
|
159
|
+
lfd f8,-32-(6*8)(r28)
|
|
160
|
+
nop
|
|
161
|
+
lfd f9,-32-(5*8)(r28)
|
|
162
|
+
lfd f10,-32-(4*8)(r28)
|
|
163
|
+
lfd f11,-32-(3*8)(r28)
|
|
164
|
+
lfd f12,-32-(2*8)(r28)
|
|
165
|
+
nop
|
|
166
|
+
lfd f13,-32-(1*8)(r28)
|
|
129
167
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
mtctr r12 // r12 holds address of _ffi_prep_args
|
|
168
|
+
L2:
|
|
169
|
+
/* Make the call. */
|
|
133
170
|
bctrl
|
|
134
|
-
|
|
171
|
+
ld r2, 40(r1)
|
|
172
|
+
|
|
173
|
+
/* Now, deal with the return value. */
|
|
174
|
+
mtcrf 0x01, r31
|
|
175
|
+
|
|
176
|
+
bt 30, L(done_return_value)
|
|
177
|
+
bt 29, L(fp_return_value)
|
|
178
|
+
std r3, 0(r30)
|
|
179
|
+
|
|
180
|
+
/* Fall through... */
|
|
181
|
+
|
|
182
|
+
L(done_return_value):
|
|
183
|
+
/* Restore the registers we used and return. */
|
|
184
|
+
mr r1, r28
|
|
185
|
+
ld r0, 16(r28)
|
|
186
|
+
ld r28, -32(r1)
|
|
187
|
+
mtlr r0
|
|
188
|
+
ld r29, -24(r1)
|
|
189
|
+
ld r30, -16(r1)
|
|
190
|
+
ld r31, -8(r1)
|
|
191
|
+
blr
|
|
192
|
+
|
|
193
|
+
L(fp_return_value):
|
|
194
|
+
bf 28, L(float_return_value)
|
|
195
|
+
stfd f1, 0(r30)
|
|
196
|
+
bf 31, L(done_return_value)
|
|
197
|
+
stfd f2, 8(r30)
|
|
198
|
+
b L(done_return_value)
|
|
199
|
+
L(float_return_value):
|
|
200
|
+
stfs f1, 0(r30)
|
|
201
|
+
b L(done_return_value)
|
|
202
|
+
|
|
203
|
+
#else /* ! __64BIT__ */
|
|
204
|
+
|
|
205
|
+
.long .ffi_call_AIX, TOC[tc0], 0
|
|
206
|
+
.csect .text[PR]
|
|
207
|
+
.ffi_call_AIX:
|
|
208
|
+
/* Save registers we use. */
|
|
209
|
+
mflr r0
|
|
210
|
+
|
|
211
|
+
stw r28,-16(r1)
|
|
212
|
+
stw r29,-12(r1)
|
|
213
|
+
stw r30, -8(r1)
|
|
214
|
+
stw r31, -4(r1)
|
|
215
|
+
|
|
216
|
+
stw r0, 8(r1)
|
|
217
|
+
mr r28, r1 /* out AP. */
|
|
218
|
+
stwux r1, r1, r4
|
|
219
|
+
|
|
220
|
+
/* Save arguments over call... */
|
|
221
|
+
mr r31, r5 /* flags, */
|
|
222
|
+
mr r30, r6 /* rvalue, */
|
|
223
|
+
mr r29, r7 /* function address, */
|
|
224
|
+
stw r2, 20(r1)
|
|
225
|
+
|
|
226
|
+
/* Call ffi_prep_args. */
|
|
227
|
+
mr r4, r1
|
|
228
|
+
bl .ffi_prep_args
|
|
135
229
|
|
|
136
230
|
/* Now do the call. */
|
|
137
|
-
lwz
|
|
231
|
+
lwz r0, 0(r29)
|
|
232
|
+
lwz r2, 4(r29)
|
|
233
|
+
lwz r11, 8(r29)
|
|
138
234
|
/* Set up cr1 with bits 4-7 of the flags. */
|
|
139
|
-
mtcrf 0x40,r31
|
|
140
|
-
|
|
141
|
-
mtctr r12
|
|
142
|
-
lwz r2,4(r29)
|
|
235
|
+
mtcrf 0x40, r31
|
|
236
|
+
mtctr r0
|
|
143
237
|
/* Load all those argument registers. */
|
|
144
238
|
// We have set up a nice stack frame, just load it into registers.
|
|
145
|
-
lwz
|
|
146
|
-
lwz
|
|
147
|
-
lwz
|
|
148
|
-
lwz
|
|
239
|
+
lwz r3, 20+(1*4)(r1)
|
|
240
|
+
lwz r4, 20+(2*4)(r1)
|
|
241
|
+
lwz r5, 20+(3*4)(r1)
|
|
242
|
+
lwz r6, 20+(4*4)(r1)
|
|
149
243
|
nop
|
|
150
|
-
lwz
|
|
151
|
-
lwz
|
|
152
|
-
lwz
|
|
153
|
-
lwz
|
|
244
|
+
lwz r7, 20+(5*4)(r1)
|
|
245
|
+
lwz r8, 20+(6*4)(r1)
|
|
246
|
+
lwz r9, 20+(7*4)(r1)
|
|
247
|
+
lwz r10,20+(8*4)(r1)
|
|
154
248
|
|
|
155
249
|
L1:
|
|
156
250
|
/* Load all the FP registers. */
|
|
@@ -165,47 +259,48 @@ L1:
|
|
|
165
259
|
lfd f7,-16-(7*8)(r28)
|
|
166
260
|
lfd f8,-16-(6*8)(r28)
|
|
167
261
|
nop
|
|
168
|
-
lfd
|
|
169
|
-
lfd
|
|
170
|
-
lfd
|
|
171
|
-
lfd
|
|
262
|
+
lfd f9,-16-(5*8)(r28)
|
|
263
|
+
lfd f10,-16-(4*8)(r28)
|
|
264
|
+
lfd f11,-16-(3*8)(r28)
|
|
265
|
+
lfd f12,-16-(2*8)(r28)
|
|
172
266
|
nop
|
|
173
|
-
lfd
|
|
267
|
+
lfd f13,-16-(1*8)(r28)
|
|
174
268
|
|
|
175
269
|
L2:
|
|
176
270
|
/* Make the call. */
|
|
177
271
|
bctrl
|
|
178
|
-
lwz
|
|
272
|
+
lwz r2, 20(r1)
|
|
179
273
|
|
|
180
274
|
/* Now, deal with the return value. */
|
|
181
|
-
mtcrf 0x01,r31
|
|
275
|
+
mtcrf 0x01, r31
|
|
182
276
|
|
|
183
|
-
bt 30,L(done_return_value)
|
|
184
|
-
bt 29,L(fp_return_value)
|
|
185
|
-
stw r3,0(r30)
|
|
186
|
-
bf 28,L(done_return_value)
|
|
187
|
-
stw r4,4(r30)
|
|
277
|
+
bt 30, L(done_return_value)
|
|
278
|
+
bt 29, L(fp_return_value)
|
|
279
|
+
stw r3, 0(r30)
|
|
280
|
+
bf 28, L(done_return_value)
|
|
281
|
+
stw r4, 4(r30)
|
|
188
282
|
|
|
189
283
|
/* Fall through... */
|
|
190
284
|
|
|
191
285
|
L(done_return_value):
|
|
192
286
|
/* Restore the registers we used and return. */
|
|
193
|
-
|
|
194
|
-
lwz
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
lwz r29,-12(
|
|
198
|
-
lwz
|
|
199
|
-
lwz
|
|
287
|
+
mr r1, r28
|
|
288
|
+
lwz r0, 8(r28)
|
|
289
|
+
lwz r28,-16(r1)
|
|
290
|
+
mtlr r0
|
|
291
|
+
lwz r29,-12(r1)
|
|
292
|
+
lwz r30, -8(r1)
|
|
293
|
+
lwz r31, -4(r1)
|
|
200
294
|
blr
|
|
201
295
|
|
|
202
296
|
L(fp_return_value):
|
|
203
|
-
bf 28,L(float_return_value)
|
|
204
|
-
stfd f1,0(r30)
|
|
297
|
+
bf 28, L(float_return_value)
|
|
298
|
+
stfd f1, 0(r30)
|
|
205
299
|
b L(done_return_value)
|
|
206
300
|
L(float_return_value):
|
|
207
|
-
stfs f1,0(r30)
|
|
301
|
+
stfs f1, 0(r30)
|
|
208
302
|
b L(done_return_value)
|
|
303
|
+
#endif
|
|
209
304
|
.long 0
|
|
210
305
|
.byte 0,0,0,1,128,4,0,0
|
|
211
306
|
//END(ffi_call_AIX)
|
|
@@ -216,7 +311,11 @@ L(float_return_value):
|
|
|
216
311
|
.globl .ffi_call_DARWIN
|
|
217
312
|
.csect ffi_call_DARWIN[DS]
|
|
218
313
|
ffi_call_DARWIN:
|
|
314
|
+
#ifdef __64BIT__
|
|
315
|
+
.llong .ffi_call_DARWIN, TOC[tc0], 0
|
|
316
|
+
#else
|
|
219
317
|
.long .ffi_call_DARWIN, TOC[tc0], 0
|
|
318
|
+
#endif
|
|
220
319
|
.csect .text[PR]
|
|
221
320
|
.ffi_call_DARWIN:
|
|
222
321
|
blr
|