Import of v1 code.
This commit is contained in:
11
libffi/ChangeLog
Normal file
11
libffi/ChangeLog
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
1998-11-29 Anthony Green <green@raft.ppp.tsoft.net>
|
||||||
|
|
||||||
|
* include/ChangeLog: Remboved.
|
||||||
|
* src/ChangeLog: Remboved.
|
||||||
|
* src/mips/ChangeLog: Remboved.
|
||||||
|
* src/sparc/ChangeLog: Remboved.
|
||||||
|
* src/x86/ChangeLog: Remboved.
|
||||||
|
|
||||||
|
* ChangeLog.v1: Created.
|
||||||
|
|
||||||
|
|
||||||
764
libffi/ChangeLog.v1
Normal file
764
libffi/ChangeLog.v1
Normal file
@@ -0,0 +1,764 @@
|
|||||||
|
The libffi version 1 ChangeLog archive.
|
||||||
|
|
||||||
|
Version 1 of libffi had per-directory ChangeLogs. Current and future
|
||||||
|
versions have a single ChangeLog file in the root directory. The
|
||||||
|
version 1 ChangeLogs have all been concatonated into this file for
|
||||||
|
future reference only.
|
||||||
|
|
||||||
|
--- libffi ----------------------------------------------------------------
|
||||||
|
|
||||||
|
Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Boosted rev.
|
||||||
|
* configure, Makefile.in, aclocal.m4: Rebuilt.
|
||||||
|
* README: Boosted rev and updated release notes.
|
||||||
|
|
||||||
|
Mon Oct 5 01:03:03 1998 Anthony Green <green@cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Boosted rev.
|
||||||
|
* configure, Makefile.in, aclocal.m4: Rebuilt.
|
||||||
|
* README: Boosted rev and updated release notes.
|
||||||
|
|
||||||
|
1998-07-25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags.
|
||||||
|
Correctly handle small structures.
|
||||||
|
(ffi_prep_args): Also handle small structures.
|
||||||
|
(ffi_call): Pass size of return type to ffi_call_SYSV.
|
||||||
|
* m68k/sysv.S: Adjust for above changes. Correctly align small
|
||||||
|
structures in the return value.
|
||||||
|
|
||||||
|
* types.c (uint64, sint64) [M68K]: Change alignment to 4.
|
||||||
|
|
||||||
|
Fri Apr 17 17:26:58 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Boosted rev.
|
||||||
|
* configure,Makefile.in,aclocal.m4: Rebuilt.
|
||||||
|
* README: Boosted rev and added release notes.
|
||||||
|
|
||||||
|
Sun Feb 22 00:50:41 1998 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* configure.in: Add PowerPC config bits.
|
||||||
|
|
||||||
|
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM
|
||||||
|
to AC_CANONICAL_HOST, this is not a compiler. Use $host instead
|
||||||
|
of $target. Remove AC_CHECK_SIZEOF(char), we already know the
|
||||||
|
result. Fix argument of AC_ARG_ENABLE.
|
||||||
|
* configure, fficonfig.h.in: Rebuilt.
|
||||||
|
|
||||||
|
Tue Feb 10 20:53:40 1998 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Add Alpha config bits.
|
||||||
|
|
||||||
|
Tue May 13 13:39:20 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* README: Updated dates and reworded Irix comments.
|
||||||
|
|
||||||
|
* configure.in: Removed AC_PROG_RANLIB.
|
||||||
|
|
||||||
|
* Makefile.in, aclocal.m4, config.guess, config.sub, configure,
|
||||||
|
ltmain.sh, */Makefile.in: libtoolized again and rebuilt with
|
||||||
|
automake and autoconf.
|
||||||
|
|
||||||
|
Sat May 10 18:44:50 1997 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* configure, aclocal.m4: Rebuilt.
|
||||||
|
* configure.in: Don't compute EXTRADIST; now handled in
|
||||||
|
src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE.
|
||||||
|
Don't run AM_MAINTAINER_MODE.
|
||||||
|
|
||||||
|
Thu May 8 14:34:05 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* missing, ltmain.sh, ltconfig.sh: Created. These are new files
|
||||||
|
required by automake and libtool.
|
||||||
|
|
||||||
|
* README: Boosted rev to 1.14. Added notes.
|
||||||
|
|
||||||
|
* acconfig.h: Moved PACKAGE and VERSION for new automake.
|
||||||
|
|
||||||
|
* configure.in: Changes for libtool.
|
||||||
|
|
||||||
|
* Makefile.am (check): make test now make check. Uses libtool now.
|
||||||
|
|
||||||
|
* Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt.
|
||||||
|
|
||||||
|
Thu May 1 16:27:07 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* missing: Added file required by new automake.
|
||||||
|
|
||||||
|
Tue Nov 26 14:10:42 1996 Anthony Green <green@csk3.cygnus.com>
|
||||||
|
|
||||||
|
* acconfig.h: Added USING_PURIFY flag. This is defined when
|
||||||
|
--enable-purify-safety was used at configure time.
|
||||||
|
|
||||||
|
* configure.in (allsources): Added --enable-purify-safety switch.
|
||||||
|
(VERSION): Boosted rev to 1.13.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
Fri Nov 22 06:46:12 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in (VERSION): Boosted rev to 1.12.
|
||||||
|
Removed special CFLAGS hack for gcc.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Boosted rev to 1.12. Added notes.
|
||||||
|
|
||||||
|
* Many files: Cygnus Support changed to Cygnus Solutions.
|
||||||
|
|
||||||
|
Wed Oct 30 11:15:25 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in (VERSION): Boosted rev to 1.11.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Boosted rev to 1.11. Added notes about GNU make.
|
||||||
|
|
||||||
|
Tue Oct 29 12:25:12 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Fixed -Wall trick.
|
||||||
|
(VERSION): Boosted rev.
|
||||||
|
* configure: Rebuilt
|
||||||
|
|
||||||
|
* acconfig.h: Needed for --enable-debug configure switch.
|
||||||
|
|
||||||
|
* README: Boosted rev to 1.09. Added more notes on building
|
||||||
|
libffi, and LCLint.
|
||||||
|
|
||||||
|
* configure.in: Added --enable-debug switch. Boosted rev to
|
||||||
|
1.09.
|
||||||
|
* configure: Rebuilt
|
||||||
|
|
||||||
|
Tue Oct 15 13:11:28 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in (VERSION): Boosted rev to 1.08
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Added n32 bug fix notes.
|
||||||
|
|
||||||
|
* Makefile.am: Added "make lint" production.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Mon Oct 14 10:54:46 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* README: Added web page reference.
|
||||||
|
|
||||||
|
* configure.in, README: Boosted rev to 1.05
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Fixed n32 sample code.
|
||||||
|
|
||||||
|
Fri Oct 11 17:09:28 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* README: Added sparc notes.
|
||||||
|
|
||||||
|
* configure.in, README: Boosted rev to 1.04.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
Thu Oct 10 10:31:03 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in, README: Boosted rev to 1.03.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Added struct notes.
|
||||||
|
|
||||||
|
* Makefile.am (EXTRA_DIST): Added LICENSE to distribution.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
* README: Removed Linux section. No special notes now
|
||||||
|
because aggregates arg/return types work.
|
||||||
|
|
||||||
|
Wed Oct 9 16:16:42 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* README, configure.in (VERSION): Boosted rev to 1.02
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
Tue Oct 8 11:56:33 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* README (NOTE): Added n32 notes.
|
||||||
|
|
||||||
|
* Makefile.am: Added test production.
|
||||||
|
* Makefile: Rebuilt
|
||||||
|
|
||||||
|
* README: spell checked!
|
||||||
|
|
||||||
|
* configure.in (VERSION): Boosted rev to 1.01
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
Mon Oct 7 15:50:22 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: Added nasty bit to support SGI tools.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* README: Added SGI notes. Added note about automake bug.
|
||||||
|
|
||||||
|
Mon Oct 7 11:00:28 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* README: Rewrote intro, and fixed examples.
|
||||||
|
|
||||||
|
Fri Oct 4 10:19:55 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* configure.in: -D$TARGET is no longer used as a compiler switch.
|
||||||
|
It is now inserted into ffi.h at configure time.
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status.
|
||||||
|
|
||||||
|
Thu Oct 3 13:47:34 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* README, LICENSE: Created. Wrote some docs.
|
||||||
|
|
||||||
|
* configure.in: Don't barf on i586-unknown-linuxaout.
|
||||||
|
Added EXTRADIST code for "make dist".
|
||||||
|
* configure: Rebuilt.
|
||||||
|
|
||||||
|
* */Makefile.in: Rebuilt with patched automake.
|
||||||
|
|
||||||
|
Tue Oct 1 17:12:25 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am, aclocal.m4, config.guess, config.sub,
|
||||||
|
configure.in, fficonfig.h.in, install-sh, mkinstalldirs,
|
||||||
|
stamp-h.in: Created
|
||||||
|
* Makefile.in, configure: Generated
|
||||||
|
|
||||||
|
--- libffi/include --------------------------------------------------------
|
||||||
|
|
||||||
|
Tue Feb 24 13:09:36 1998 Anthony Green <green@gerbil.cygnus.com>
|
||||||
|
|
||||||
|
* ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on
|
||||||
|
ffi.h.in changes. This is a work-around for SGI's "simple"
|
||||||
|
assembler.
|
||||||
|
|
||||||
|
Sun Feb 22 00:51:55 1998 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* ffi.h.in: PowerPC support.
|
||||||
|
|
||||||
|
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* ffi.h.in: Add m68k support.
|
||||||
|
(FFI_TYPE_LONGDOUBLE): Make it a separate value.
|
||||||
|
|
||||||
|
Tue Feb 10 20:55:16 1998 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in (SIZEOF_ARG): Use a pointer type by default.
|
||||||
|
|
||||||
|
* ffi.h.in: Alpha support.
|
||||||
|
|
||||||
|
Fri Nov 22 06:48:45 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions.
|
||||||
|
|
||||||
|
Wed Nov 20 22:31:01 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Added ffi_type_void definition.
|
||||||
|
|
||||||
|
Tue Oct 29 12:22:40 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am (hack_DATA): Always install ffi_mips.h.
|
||||||
|
|
||||||
|
* ffi.h.in: Removed FFI_DEBUG. It's now in the correct
|
||||||
|
place (acconfig.h).
|
||||||
|
Added #include <stddef.h> for size_t definition.
|
||||||
|
|
||||||
|
Tue Oct 15 17:23:35 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in, ffi_common.h, ffi_mips.h: More clean up.
|
||||||
|
Commented out #define of FFI_DEBUG.
|
||||||
|
|
||||||
|
Tue Oct 15 13:01:06 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi_common.h: Added bool definition.
|
||||||
|
|
||||||
|
* ffi.h.in, ffi_common.h: Clean up based on LCLint output.
|
||||||
|
Added funny /*@...@*/ comments to annotate source.
|
||||||
|
|
||||||
|
Mon Oct 14 12:29:23 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Interface changes based on feedback from Jim
|
||||||
|
Blandy.
|
||||||
|
|
||||||
|
Fri Oct 11 16:49:35 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Small change for sparc support.
|
||||||
|
|
||||||
|
Thu Oct 10 14:53:37 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for
|
||||||
|
special structure return types.
|
||||||
|
|
||||||
|
Wed Oct 9 13:55:57 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Added SIZEOF_ARG definition for X86
|
||||||
|
|
||||||
|
Tue Oct 8 11:40:36 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings.
|
||||||
|
Use it to case your function pointers to the proper type.
|
||||||
|
|
||||||
|
* ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug.
|
||||||
|
|
||||||
|
* Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST.
|
||||||
|
* Makefile: Rebuilt.
|
||||||
|
|
||||||
|
* ffi_mips.h: Created. Moved all common mips definitions here.
|
||||||
|
|
||||||
|
Mon Oct 7 10:58:12 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: The SGI assember is very picky about parens. Redefined
|
||||||
|
some macros to avoid problems.
|
||||||
|
|
||||||
|
* ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added
|
||||||
|
externs for pointer, and 64bit integral ffi_types.
|
||||||
|
|
||||||
|
Fri Oct 4 09:51:37 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Added FFI_ABI member to ffi_cif and changed
|
||||||
|
function prototypes accordingly.
|
||||||
|
Added #define @TARGET@. Now programs including ffi.h don't
|
||||||
|
have to specify this themselves.
|
||||||
|
|
||||||
|
Thu Oct 3 15:36:44 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in: Changed ffi_prep_cif's values from void* to void**
|
||||||
|
|
||||||
|
* Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist"
|
||||||
|
to work.
|
||||||
|
* Makefile.in: Regenerated.
|
||||||
|
|
||||||
|
Wed Oct 2 10:16:59 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am: Created
|
||||||
|
* Makefile.in: Generated
|
||||||
|
|
||||||
|
* ffi_common.h: Added rcsid comment
|
||||||
|
|
||||||
|
Tue Oct 1 17:13:51 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.h.in, ffi_common.h: Created
|
||||||
|
|
||||||
|
--- libffi/src ------------------------------------------------------------
|
||||||
|
|
||||||
|
Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com>
|
||||||
|
|
||||||
|
* arm/ffi.c, arm/sysv.S: Created.
|
||||||
|
|
||||||
|
* Makefile.am: Added arm files.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Mon Oct 5 01:41:38 1998 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am (libffi_la_LDFLAGS): Incremented revision.
|
||||||
|
|
||||||
|
Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com>
|
||||||
|
|
||||||
|
* alpha/osf.S (ffi_call_osf): Patch for DU assembler.
|
||||||
|
|
||||||
|
* ffitest.c (main): long long and long double return values work
|
||||||
|
for x86.
|
||||||
|
|
||||||
|
Fri Apr 17 11:50:58 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
* ffitest.c (main): Floating point tests not executed for systems
|
||||||
|
with broken lond double (SunOS 4 w/ GCC).
|
||||||
|
|
||||||
|
* types.c: Fixed x86 alignment info for long long types.
|
||||||
|
|
||||||
|
Thu Apr 16 07:15:28 1998 Anthony Green <green@ada.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c: Added more notes about GCC bugs under Irix 6.
|
||||||
|
|
||||||
|
Wed Apr 15 08:42:22 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c (struct5): New test function.
|
||||||
|
(main): New test with struct5.
|
||||||
|
|
||||||
|
Thu Mar 5 10:48:11 1998 Anthony Green <green@tootie.to.cygnus.com>
|
||||||
|
|
||||||
|
* prep_cif.c (initialize_aggregate): Fix assertion for
|
||||||
|
nested structures.
|
||||||
|
|
||||||
|
Tue Feb 24 16:33:41 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Added long double support for sparc.
|
||||||
|
|
||||||
|
Sun Feb 22 00:52:18 1998 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* powerpc/asm.h: New file.
|
||||||
|
* powerpc/ffi.c: New file.
|
||||||
|
* powerpc/sysv.S: New file.
|
||||||
|
* Makefile.am: PowerPC port.
|
||||||
|
* ffitest.c (main): Allow all tests to run even in presence of gcc
|
||||||
|
bug on PowerPC.
|
||||||
|
|
||||||
|
1998-02-17 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* mips/ffi.c: Fixed comment typo.
|
||||||
|
|
||||||
|
* x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat):
|
||||||
|
Fixed x86 long double return handling.
|
||||||
|
|
||||||
|
* types.c: Fixed x86 long double alignment info.
|
||||||
|
|
||||||
|
1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* types.c: Add m68k support.
|
||||||
|
|
||||||
|
* ffitest.c (floating): Add long double parameter.
|
||||||
|
(return_ll, ldblit): New functions to test long long and long
|
||||||
|
double return value.
|
||||||
|
(main): Fix type error in assignment of ts[1-4]_type.elements.
|
||||||
|
Add tests for long long and long double arguments and return
|
||||||
|
values.
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for
|
||||||
|
struct value pointer.
|
||||||
|
|
||||||
|
* m68k/ffi.c, m68k/sysv.S: New files.
|
||||||
|
* Makefile.am: Add bits for m68k port. Add kludge to work around
|
||||||
|
automake deficiency.
|
||||||
|
(test): Don't require "." in $PATH.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Wed Feb 11 07:36:50 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Tue Feb 10 20:56:00 1998 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
|
* alpha/ffi.c, alpha/osf.S: New files.
|
||||||
|
* Makefile.am: Alpha port.
|
||||||
|
|
||||||
|
Tue Nov 18 14:12:07 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag
|
||||||
|
for n32.
|
||||||
|
|
||||||
|
Tue Jun 3 17:18:20 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c (main): Added hack to get structure tests working
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
Sat May 10 19:06:42 1997 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
* Makefile.am (EXTRA_DIST): Explicitly list all distributable
|
||||||
|
files in subdirs.
|
||||||
|
(VERSION, CC): Removed.
|
||||||
|
|
||||||
|
Thu May 8 17:19:01 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am: Many changes for new automake and libtool.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Fri Nov 22 06:57:56 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c (main): Fixed test case for non mips machines.
|
||||||
|
|
||||||
|
Wed Nov 20 22:31:59 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* types.c: Added ffi_type_void declaration.
|
||||||
|
|
||||||
|
Tue Oct 29 13:07:19 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c (main): Fixed character constants.
|
||||||
|
(main): Emit warning for structure test 3 failure on Sun.
|
||||||
|
|
||||||
|
* Makefile.am (VPATH): Fixed VPATH def'n so automake won't
|
||||||
|
strip it out.
|
||||||
|
Moved distdir hack from libffi to automake.
|
||||||
|
(ffitest): Added missing -c for $(COMPILE) (change in automake).
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
Tue Oct 15 13:08:20 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am: Added "make lint" production.
|
||||||
|
* Makefile.in: Rebuilt.
|
||||||
|
|
||||||
|
* prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro.
|
||||||
|
Clean up based on LCLint output. Added funny /*@...@*/ comments to
|
||||||
|
annotate source.
|
||||||
|
|
||||||
|
* ffitest.c, debug.c: Cleaned up code.
|
||||||
|
|
||||||
|
Mon Oct 14 12:26:56 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c: Changes based on interface changes.
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Cleaned up interface based on
|
||||||
|
feedback from Jim Blandy.
|
||||||
|
|
||||||
|
Fri Oct 11 15:53:18 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c: Reordered tests while porting to sparc.
|
||||||
|
Made changes to handle lame structure passing for sparc.
|
||||||
|
Removed calls to fflush().
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Added special case for sparc
|
||||||
|
aggregate type arguments.
|
||||||
|
|
||||||
|
Thu Oct 10 09:56:51 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffitest.c (main): Added structure passing/returning tests.
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Perform proper initialization
|
||||||
|
of structure return types if needed.
|
||||||
|
(initialize_aggregate): Bug fix
|
||||||
|
|
||||||
|
Wed Oct 9 16:04:20 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* types.c: Added special definitions for x86 (double doesn't
|
||||||
|
need double word alignment).
|
||||||
|
|
||||||
|
* ffitest.c: Added many tests
|
||||||
|
|
||||||
|
Tue Oct 8 09:19:22 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Fixed assertion.
|
||||||
|
|
||||||
|
* debug.c (ffi_assert): Must return a non void now.
|
||||||
|
|
||||||
|
* Makefile.am: Added test production.
|
||||||
|
* Makefile: Rebuilt.
|
||||||
|
|
||||||
|
* ffitest.c (main): Created.
|
||||||
|
|
||||||
|
* types.c: Created. Stripped common code out of */ffi.c.
|
||||||
|
|
||||||
|
* prep_cif.c: Added missing stdlib.h include.
|
||||||
|
|
||||||
|
* debug.c (ffi_type_test): Used "a" to eliminate compiler
|
||||||
|
warnings in non-debug builds. Included ffi_common.h.
|
||||||
|
|
||||||
|
Mon Oct 7 15:36:42 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.am: Added a rule for .s -> .o
|
||||||
|
This is required by the SGI compiler.
|
||||||
|
* Makefile: Rebuilt.
|
||||||
|
|
||||||
|
Fri Oct 4 09:51:08 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* prep_cif.c (initialize_aggregate): Moved abi specification
|
||||||
|
to ffi_prep_cif().
|
||||||
|
|
||||||
|
Thu Oct 3 15:37:37 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* prep_cif.c (ffi_prep_cif): Changed values from void* to void**.
|
||||||
|
(initialize_aggregate): Fixed aggregate type initialization.
|
||||||
|
|
||||||
|
* Makefile.am (EXTRA_DIST): Added support code for "make dist".
|
||||||
|
* Makefile.in: Regenerated.
|
||||||
|
|
||||||
|
Wed Oct 2 11:41:57 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* debug.c, prep_cif: Created.
|
||||||
|
|
||||||
|
* Makefile.am: Added debug.o and prep_cif.o to OBJ.
|
||||||
|
* Makefile.in: Regenerated.
|
||||||
|
|
||||||
|
* Makefile.am (INCLUDES): Added missing -I../include
|
||||||
|
* Makefile.in: Regenerated.
|
||||||
|
|
||||||
|
Tue Oct 1 17:11:51 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* error.c, Makefile.am: Created.
|
||||||
|
* Makefile.in: Generated.
|
||||||
|
|
||||||
|
--- libffi/src/x86 --------------------------------------------------------
|
||||||
|
|
||||||
|
Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com>
|
||||||
|
|
||||||
|
* sysv.S (retlongdouble): Fixed long long return value support.
|
||||||
|
* ffi.c (ffi_prep_cif_machdep): Ditto.
|
||||||
|
|
||||||
|
Wed May 13 04:30:33 1998 Anthony Green <green@raft.ppp.tsoft.net>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_cif_machdep): Fixed long double return value
|
||||||
|
support.
|
||||||
|
|
||||||
|
Wed Apr 15 08:43:20 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): small struct support was missing.
|
||||||
|
|
||||||
|
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* objects.mak: Removed.
|
||||||
|
|
||||||
|
Mon Dec 2 15:12:58 1996 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* sysv.S: Use .balign, for a.out Linux boxes.
|
||||||
|
|
||||||
|
Tue Oct 15 13:06:50 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c: Clean up based on LCLint output.
|
||||||
|
Added funny /*@...@*/ comments to annotate source.
|
||||||
|
|
||||||
|
Fri Oct 11 16:43:38 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_call): Added assertion for bad ABIs.
|
||||||
|
|
||||||
|
Wed Oct 9 13:57:27 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* sysv.S (retdouble): Fixed double return problems.
|
||||||
|
|
||||||
|
* ffi.c (ffi_call): Corrected fn arg definition.
|
||||||
|
(ffi_prep_cif_machdep): Fixed double return problems
|
||||||
|
|
||||||
|
Tue Oct 8 12:12:49 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c: Moved ffi_type definitions to types.c.
|
||||||
|
(ffi_prep_args): Fixed type promotion bug.
|
||||||
|
|
||||||
|
Mon Oct 7 15:53:06 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
|
||||||
|
|
||||||
|
Fri Oct 4 09:54:53 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
|
||||||
|
remaining args.
|
||||||
|
|
||||||
|
Wed Oct 2 10:07:05 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c, sysv.S, objects.mak: Created.
|
||||||
|
(ffi_prep_cif): cif->rvalue no longer initialized to NULL.
|
||||||
|
(ffi_prep_cif_machdep): Moved machine independent cif processing
|
||||||
|
to src/prep_cif.c. Introduced ffi_prep_cif_machdep().
|
||||||
|
|
||||||
|
--- libffi/src/mips -------------------------------------------------------
|
||||||
|
|
||||||
|
Tue Feb 17 17:18:07 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* o32.S: Fixed typo in comment.
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_cif_machdep): Fixed argument processing.
|
||||||
|
|
||||||
|
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* o32.s, n32.s: Wrappers for SGI tool support.
|
||||||
|
|
||||||
|
* objects.mak: Removed.
|
||||||
|
|
||||||
|
Tue Oct 29 14:37:45 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): Changed int z to size_t z.
|
||||||
|
|
||||||
|
Tue Oct 15 13:17:25 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* n32.S: Fixed bad stack munging.
|
||||||
|
|
||||||
|
* ffi.c: Moved prototypes for ffi_call_?32() to here from
|
||||||
|
ffi_mips.h because extended_cif is not defined in ffi_mips.h.
|
||||||
|
|
||||||
|
Mon Oct 14 12:42:02 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c: Interface changes based on feedback from Jim Blandy.
|
||||||
|
|
||||||
|
Thu Oct 10 11:22:16 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* n32.S, ffi.c: Lots of changes to support passing and
|
||||||
|
returning structures with the n32 calling convention.
|
||||||
|
|
||||||
|
* n32.S: Fixed fn pointer bug.
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_cif_machdep): Fix for o32 structure
|
||||||
|
return values.
|
||||||
|
(ffi_prep_args): Fixed n32 structure passing when structures
|
||||||
|
partially fit in registers.
|
||||||
|
|
||||||
|
Wed Oct 9 13:49:25 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* objects.mak: Added n32.o.
|
||||||
|
|
||||||
|
* n32.S: Created.
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): Added magic to support proper
|
||||||
|
n32 processing.
|
||||||
|
|
||||||
|
Tue Oct 8 10:37:35 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c: Moved ffi_type definitions to types.c.
|
||||||
|
(ffi_prep_args): Fixed type promotion bug.
|
||||||
|
|
||||||
|
* o32.S: This code is only built for o32 compiles.
|
||||||
|
A lot of the #define cruft has moved to ffi_mips.h.
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg
|
||||||
|
is only processed if the first is either a float or double.
|
||||||
|
|
||||||
|
Mon Oct 7 15:33:59 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* o32.S: Modified to compile under each of o32, n32 and n64.
|
||||||
|
|
||||||
|
* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
|
||||||
|
|
||||||
|
Fri Oct 4 09:53:25 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
|
||||||
|
remaining args.
|
||||||
|
|
||||||
|
Wed Oct 2 17:41:22 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* o32.S: Removed crufty definitions.
|
||||||
|
|
||||||
|
Wed Oct 2 12:53:42 1996 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL.
|
||||||
|
(ffi_prep_cif_machdep): Moved all machine independent cif processing
|
||||||
|
to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types
|
||||||
|
of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT.
|
||||||
|
|
||||||
|
Tue Oct 1 17:11:02 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c, o32.S, object.mak: Created
|
||||||
|
|
||||||
|
--- libffi/src/sparc ------------------------------------------------------
|
||||||
|
|
||||||
|
Tue Feb 24 16:33:18 1998 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): Added long double support.
|
||||||
|
|
||||||
|
Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* objects.mak: Removed.
|
||||||
|
|
||||||
|
Thu May 1 16:07:56 1997 Anthony Green <green@hoser.cygnus.com>
|
||||||
|
|
||||||
|
* v8.S: Fixed minor portability problem reported by
|
||||||
|
Russ McManus <mcmanr@eq.gs.com>.
|
||||||
|
|
||||||
|
Tue Nov 26 14:12:43 1996 Anthony Green <green@csk3.cygnus.com>
|
||||||
|
|
||||||
|
* v8.S: Used STACKFRAME define elsewhere.
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): Zero out space when USING_PURIFY
|
||||||
|
is set.
|
||||||
|
(ffi_prep_cif_machdep): Allocate the correct stack frame
|
||||||
|
space for functions with < 6 args.
|
||||||
|
|
||||||
|
Tue Oct 29 15:08:55 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c (ffi_prep_args): int z is now size_t z.
|
||||||
|
|
||||||
|
Mon Oct 14 13:31:24 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* v8.S (ffi_call_V8): Gordon rewrites this again. It looks
|
||||||
|
great now.
|
||||||
|
|
||||||
|
* ffi.c (ffi_call): The comment about hijacked registers
|
||||||
|
is no longer valid after gordoni hacked v8.S.
|
||||||
|
|
||||||
|
* v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler.
|
||||||
|
|
||||||
|
* v8.S, ffi.c: ffi_call() had changed to accept more than
|
||||||
|
two args, so v8.S had to change (because it hijacks incoming
|
||||||
|
arg registers).
|
||||||
|
|
||||||
|
* ffi.c: Interface changes based on feedback from Jim Blandy.
|
||||||
|
|
||||||
|
Thu Oct 10 17:48:16 1996 Anthony Green <green@rtl.cygnus.com>
|
||||||
|
|
||||||
|
* ffi.c, v8.S, objects.mak: Created.
|
||||||
|
|
||||||
|
|
||||||
20
libffi/LICENSE
Normal file
20
libffi/LICENSE
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
libffi - Copyright (c) 1996, 1997, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
13
libffi/Makefile.am
Normal file
13
libffi/Makefile.am
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
## Process this with automake to create Makefile.in
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
SUBDIRS = include src
|
||||||
|
|
||||||
|
EXTRA_DIST = LICENSE
|
||||||
|
|
||||||
|
test:
|
||||||
|
(cd src; $(MAKE) test)
|
||||||
|
|
||||||
|
lint:
|
||||||
|
(cd src; $(MAKE) lint)
|
||||||
322
libffi/Makefile.in
Normal file
322
libffi/Makefile.in
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.2 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = .
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = true
|
||||||
|
PRE_INSTALL = true
|
||||||
|
POST_INSTALL = true
|
||||||
|
NORMAL_UNINSTALL = true
|
||||||
|
PRE_UNINSTALL = true
|
||||||
|
POST_UNINSTALL = true
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CC = @CC@
|
||||||
|
LD = @LD@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
TARGET = @TARGET@
|
||||||
|
TARGETDIR = @TARGETDIR@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
SUBDIRS = include src
|
||||||
|
|
||||||
|
EXTRA_DIST = LICENSE
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = fficonfig.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = README ChangeLog Makefile.am Makefile.in acconfig.h \
|
||||||
|
aclocal.m4 config.guess config.sub configure configure.in \
|
||||||
|
fficonfig.h.in install-sh ltconfig ltmain.sh missing mkinstalldirs \
|
||||||
|
stamp-h.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
default: all
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
$(ACLOCAL_M4): configure.in
|
||||||
|
cd $(srcdir) && $(ACLOCAL)
|
||||||
|
|
||||||
|
config.status: $(srcdir)/configure
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
|
||||||
|
cd $(srcdir) && $(AUTOCONF)
|
||||||
|
|
||||||
|
fficonfig.h: stamp-h
|
||||||
|
stamp-h: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES= CONFIG_HEADERS=fficonfig.h \
|
||||||
|
$(SHELL) ./config.status
|
||||||
|
@echo timestamp > stamp-h
|
||||||
|
$(srcdir)/fficonfig.h.in: $(srcdir)/stamp-h.in
|
||||||
|
$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
|
||||||
|
cd $(top_srcdir) && $(AUTOHEADER)
|
||||||
|
@echo timestamp > $(srcdir)/stamp-h.in
|
||||||
|
|
||||||
|
mostlyclean-hdr:
|
||||||
|
|
||||||
|
clean-hdr:
|
||||||
|
|
||||||
|
distclean-hdr:
|
||||||
|
rm -f fficonfig.h
|
||||||
|
|
||||||
|
maintainer-clean-hdr:
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run `make' without going through this Makefile.
|
||||||
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
all-recursive install-data-recursive install-exec-recursive \
|
||||||
|
installdirs-recursive install-recursive uninstall-recursive \
|
||||||
|
check-recursive installcheck-recursive info-recursive dvi-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
for subdir in $(SUBDIRS); do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
|
||||||
|
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||||
|
maintainer-clean-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
rev=''; for subdir in $(SUBDIRS); do rev="$$rev $$subdir"; done; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
(cd $$subdir && $(MAKE) tags); \
|
||||||
|
done
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd` && cd $(srcdir) && mkid -f$$here/ID $(SOURCES) $(HEADERS)
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||||
|
done; \
|
||||||
|
test -z "$(ETAGS_ARGS)fficonfig.h.in$(SOURCES)$(HEADERS)$$tags" \
|
||||||
|
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags fficonfig.h.in $(SOURCES) $(HEADERS) -o $$here/TAGS)
|
||||||
|
|
||||||
|
mostlyclean-tags:
|
||||||
|
|
||||||
|
clean-tags:
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
rm -f TAGS ID
|
||||||
|
|
||||||
|
maintainer-clean-tags:
|
||||||
|
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist
|
||||||
|
rm -rf $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz
|
||||||
|
mkdir $(distdir)/=build
|
||||||
|
mkdir $(distdir)/=inst
|
||||||
|
dc_install_base=`cd $(distdir)/=inst && pwd`; \
|
||||||
|
cd $(distdir)/=build \
|
||||||
|
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
|
||||||
|
&& $(MAKE) \
|
||||||
|
&& $(MAKE) dvi \
|
||||||
|
&& $(MAKE) check \
|
||||||
|
&& $(MAKE) install \
|
||||||
|
&& $(MAKE) installcheck \
|
||||||
|
&& $(MAKE) dist
|
||||||
|
rm -rf $(distdir)
|
||||||
|
@echo "========================"; \
|
||||||
|
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||||
|
echo "========================"
|
||||||
|
dist: distdir
|
||||||
|
-chmod -R a+r $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||||
|
rm -rf $(distdir)
|
||||||
|
dist-all: distdir
|
||||||
|
-chmod -R a+r $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||||
|
rm -rf $(distdir)
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
rm -rf $(distdir)
|
||||||
|
mkdir $(distdir)
|
||||||
|
-chmod 777 $(distdir)
|
||||||
|
here=`cd $(top_builddir) && pwd`; \
|
||||||
|
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||||
|
cd $(top_srcdir) \
|
||||||
|
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign Makefile
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
for subdir in $(SUBDIRS); do \
|
||||||
|
test -d $(distdir)/$$subdir \
|
||||||
|
|| mkdir $(distdir)/$$subdir \
|
||||||
|
|| exit 1; \
|
||||||
|
chmod 777 $(distdir)/$$subdir; \
|
||||||
|
(cd $$subdir && $(MAKE) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
done
|
||||||
|
info: info-recursive
|
||||||
|
dvi: dvi-recursive
|
||||||
|
check: all-am
|
||||||
|
$(MAKE) check-recursive
|
||||||
|
installcheck: installcheck-recursive
|
||||||
|
all-recursive-am: fficonfig.h
|
||||||
|
$(MAKE) all-recursive
|
||||||
|
|
||||||
|
all-am: Makefile fficonfig.h
|
||||||
|
|
||||||
|
install-exec: install-exec-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data: install-data-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-recursive
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall: uninstall-recursive
|
||||||
|
|
||||||
|
all: all-recursive-am all-am
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic
|
||||||
|
|
||||||
|
clean-am: clean-hdr clean-tags clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean-am: distclean-hdr distclean-tags distclean-generic clean-am
|
||||||
|
|
||||||
|
maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \
|
||||||
|
maintainer-clean-generic distclean-am
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive mostlyclean-am
|
||||||
|
|
||||||
|
clean: clean-recursive clean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive distclean-am
|
||||||
|
rm -f config.status
|
||||||
|
rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
rm -f config.status
|
||||||
|
|
||||||
|
.PHONY: default mostlyclean-hdr distclean-hdr clean-hdr \
|
||||||
|
maintainer-clean-hdr install-data-recursive uninstall-data-recursive \
|
||||||
|
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
|
||||||
|
uninstalldirs-recursive all-recursive check-recursive \
|
||||||
|
installcheck-recursive info-recursive dvi-recursive \
|
||||||
|
mostlyclean-recursive distclean-recursive clean-recursive \
|
||||||
|
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
|
||||||
|
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
|
||||||
|
installcheck all-recursive-am all-am install-exec install-data install \
|
||||||
|
uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
(cd src; $(MAKE) test)
|
||||||
|
|
||||||
|
lint:
|
||||||
|
(cd src; $(MAKE) lint)
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
505
libffi/README
Normal file
505
libffi/README
Normal file
@@ -0,0 +1,505 @@
|
|||||||
|
README for libffi-2.00
|
||||||
|
|
||||||
|
libffi-2.00 has not been released yet! This is a development snapshot!
|
||||||
|
|
||||||
|
libffi-1.20 was released on October 5, 1998. Check the libffi web page
|
||||||
|
for updates: <http://www.cygnus.com/~green/libffi.html>.
|
||||||
|
|
||||||
|
If you wish to be notified of libffi releases by email, fill out the
|
||||||
|
form at <http://www.cygnus.com/~green/libffi-form.html>.
|
||||||
|
|
||||||
|
|
||||||
|
What is libffi?
|
||||||
|
===============
|
||||||
|
|
||||||
|
Compilers for high level languages generate code that follow certain
|
||||||
|
conventions. These conventions are necessary, in part, for separate
|
||||||
|
compilation to work. One such convention is the "calling
|
||||||
|
convention". The "calling convention" is essentially a set of
|
||||||
|
assumptions made by the compiler about where function arguments will
|
||||||
|
be found on entry to a function. A "calling convention" also specifies
|
||||||
|
where the return value for a function is found.
|
||||||
|
|
||||||
|
Some programs may not know at the time of compilation what arguments
|
||||||
|
are to be passed to a function. For instance, an interpreter may be
|
||||||
|
told at run-time about the number and types of arguments used to call
|
||||||
|
a given function. Libffi can be used in such programs to provide a
|
||||||
|
bridge from the interpreter program to compiled code.
|
||||||
|
|
||||||
|
The libffi library provides a portable, high level programming
|
||||||
|
interface to various calling conventions. This allows a programmer to
|
||||||
|
call any function specified by a call interface description at run
|
||||||
|
time.
|
||||||
|
|
||||||
|
Ffi stands for Foreign Function Interface. A foreign function
|
||||||
|
interface is the popular name for the interface that allows code
|
||||||
|
written in one language to call code written in another language. The
|
||||||
|
libffi library really only provides the lowest, machine dependent
|
||||||
|
layer of a fully featured foreign function interface. A layer must
|
||||||
|
exist above libffi that handles type conversions for values passed
|
||||||
|
between the two languages.
|
||||||
|
|
||||||
|
|
||||||
|
Supported Platforms and Prerequisites
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Libffi has been ported to:
|
||||||
|
|
||||||
|
SunOS 4.1.3 & Solaris 2.x (Sparc v8)
|
||||||
|
|
||||||
|
Irix 5.3 & 6.2 (System V/o32 & n32)
|
||||||
|
|
||||||
|
Intel x86 - Linux (System V ABI)
|
||||||
|
|
||||||
|
Alpha - Linux and OSF/1
|
||||||
|
|
||||||
|
m68k - Linux (System V ABI)
|
||||||
|
|
||||||
|
PowerPC - Linux (System V ABI)
|
||||||
|
|
||||||
|
ARM - Linux (System V ABI)
|
||||||
|
|
||||||
|
Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are
|
||||||
|
that other versions will work. Libffi has also been built and tested
|
||||||
|
with the SGI compiler tools.
|
||||||
|
|
||||||
|
On PowerPC, the tests failed (see the note below).
|
||||||
|
|
||||||
|
You must use GNU make to build libffi. SGI's make will not work.
|
||||||
|
Sun's probably won't either.
|
||||||
|
|
||||||
|
If you port libffi to another platform, please let me know! I assume
|
||||||
|
that some will be easy (x86 NetBSD), and others will be more difficult
|
||||||
|
(HP, AIX).
|
||||||
|
|
||||||
|
|
||||||
|
Installing libffi
|
||||||
|
=================
|
||||||
|
|
||||||
|
[Note: before actually performing any of these installation steps,
|
||||||
|
you may wish to read the "Platform Specific Notes" below.]
|
||||||
|
|
||||||
|
First you must configure the distribution for your particular
|
||||||
|
system. Go to the directory you wish to build libffi in and run the
|
||||||
|
"configure" program found in the root directory of the libffi source
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
You may want to tell configure where to install the libffi library and
|
||||||
|
header files. To do that, use the --prefix configure switch. Libffi
|
||||||
|
will install under /usr/local by default.
|
||||||
|
|
||||||
|
If you want to enable extra run-time debugging checks use the the
|
||||||
|
--enable-debug configure switch. This is useful when your program dies
|
||||||
|
mysteriously while using libffi.
|
||||||
|
|
||||||
|
Another useful configure switch is --enable-purify-safety. Using this
|
||||||
|
will add some extra code which will suppress certain warnings when you
|
||||||
|
are using Purify with libffi. Only use this switch when using
|
||||||
|
Purify, as it will slow down the library.
|
||||||
|
|
||||||
|
Configure has many other options. Use "configure --help" to see them all.
|
||||||
|
|
||||||
|
Once configure has finished, type "make". Note that you must be using
|
||||||
|
GNU make. SGI's make will not work. Sun's probably won't either.
|
||||||
|
You can ftp GNU make from prep.ai.mit.edu:/pub/gnu.
|
||||||
|
|
||||||
|
To ensure that libffi is working as advertised, type "make test".
|
||||||
|
|
||||||
|
To install the library and header files, type "make install".
|
||||||
|
|
||||||
|
|
||||||
|
Using libffi
|
||||||
|
============
|
||||||
|
|
||||||
|
The Basics
|
||||||
|
----------
|
||||||
|
|
||||||
|
Libffi assumes that you have a pointer to the function you wish to
|
||||||
|
call and that you know the number and types of arguments to pass it,
|
||||||
|
as well as the return type of the function.
|
||||||
|
|
||||||
|
The first thing you must do is create an ffi_cif object that matches
|
||||||
|
the signature of the function you wish to call. The cif in ffi_cif
|
||||||
|
stands for Call InterFace. To prepare a call interface object, use the
|
||||||
|
following function:
|
||||||
|
|
||||||
|
ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi,
|
||||||
|
unsigned int nargs,
|
||||||
|
ffi_type *rtype, ffi_type **atypes);
|
||||||
|
|
||||||
|
CIF is a pointer to the call interface object you wish
|
||||||
|
to initialize.
|
||||||
|
|
||||||
|
ABI is an enum that specifies the calling convention
|
||||||
|
to use for the call. FFI_DEFAULT_ABI defaults
|
||||||
|
to the system's native calling convention. Other
|
||||||
|
ABI's may be used with care. They are system
|
||||||
|
specific.
|
||||||
|
|
||||||
|
NARGS is the number of arguments this function accepts.
|
||||||
|
libffi does not yet support vararg functions.
|
||||||
|
|
||||||
|
RTYPE is a pointer to an ffi_type structure that represents
|
||||||
|
the return type of the function. Ffi_type objects
|
||||||
|
describe the types of values. libffi provides
|
||||||
|
ffi_type objects for many of the native C types:
|
||||||
|
signed int, unsigned int, signed char, unsigned char,
|
||||||
|
etc. There is also a pointer ffi_type object and
|
||||||
|
a void ffi_type. Use &ffi_type_void for functions that
|
||||||
|
don't return values.
|
||||||
|
|
||||||
|
ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long.
|
||||||
|
If NARGS is 0, this is ignored.
|
||||||
|
|
||||||
|
|
||||||
|
ffi_prep_cif will return a status code that you are responsible
|
||||||
|
for checking. It will be one of the following:
|
||||||
|
|
||||||
|
FFI_OK - All is good.
|
||||||
|
|
||||||
|
FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif
|
||||||
|
came across is bad.
|
||||||
|
|
||||||
|
|
||||||
|
Before making the call, the VALUES vector should be initialized
|
||||||
|
with pointers to the appropriate argument values.
|
||||||
|
|
||||||
|
To call the the function using the initialized ffi_cif, use the
|
||||||
|
ffi_call function:
|
||||||
|
|
||||||
|
void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues);
|
||||||
|
|
||||||
|
CIF is a pointer to the ffi_cif initialized specifically
|
||||||
|
for this function.
|
||||||
|
|
||||||
|
FN is a pointer to the function you want to call.
|
||||||
|
|
||||||
|
RVALUE is a pointer to a chunk of memory that is to hold the
|
||||||
|
result of the function call. Currently, it must be
|
||||||
|
at least one word in size (except for the n32 version
|
||||||
|
under Irix 6.x, which must be a pointer to an 8 byte
|
||||||
|
aligned value (a long long). It must also be at least
|
||||||
|
word aligned (depending on the return type, and the
|
||||||
|
system's alignment requirements). If RTYPE is
|
||||||
|
&ffi_type_void, this is ignored. If RVALUE is NULL,
|
||||||
|
the return value is discarded.
|
||||||
|
|
||||||
|
AVALUES is a vector of void* that point to the memory locations
|
||||||
|
holding the argument values for a call.
|
||||||
|
If NARGS is 0, this is ignored.
|
||||||
|
|
||||||
|
|
||||||
|
If you are expecting a return value from FN it will have been stored
|
||||||
|
at RVALUE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
An Example
|
||||||
|
----------
|
||||||
|
|
||||||
|
Here is a trivial example that calls puts() a few times.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
ffi_cif cif;
|
||||||
|
ffi_type *args[1];
|
||||||
|
void *values[1];
|
||||||
|
char *s;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Initialize the argument info vectors */
|
||||||
|
args[0] = &ffi_type_uint;
|
||||||
|
values[0] = &s;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_uint, args) == FFI_OK)
|
||||||
|
{
|
||||||
|
s = "Hello World!";
|
||||||
|
ffi_call(&cif, puts, &rc, values);
|
||||||
|
/* rc now holds the result of the call to puts */
|
||||||
|
|
||||||
|
/* values holds a pointer to the function's arg, so to
|
||||||
|
call puts() again all we need to do is change the
|
||||||
|
value of s */
|
||||||
|
s = "This is cool!";
|
||||||
|
ffi_call(&cif, puts, &rc, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Aggregate Types
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Although libffi has no special support for unions or bit-fields, it is
|
||||||
|
perfectly happy passing structures back and forth. You must first
|
||||||
|
describe the structure to libffi by creating a new ffi_type object
|
||||||
|
for it. Here is the definition of ffi_type:
|
||||||
|
|
||||||
|
typedef struct _ffi_type
|
||||||
|
{
|
||||||
|
unsigned size;
|
||||||
|
short alignment;
|
||||||
|
short type;
|
||||||
|
struct _ffi_type **elements;
|
||||||
|
} ffi_type;
|
||||||
|
|
||||||
|
All structures must have type set to FFI_TYPE_STRUCT. You may set
|
||||||
|
size and alignment to 0. These will be calculated and reset to the
|
||||||
|
appropriate values by ffi_prep_cif().
|
||||||
|
|
||||||
|
elements is a NULL terminated array of pointers to ffi_type objects
|
||||||
|
that describe the type of the structure elements. These may, in turn,
|
||||||
|
be structure elements.
|
||||||
|
|
||||||
|
The following example initializes a ffi_type object representing the
|
||||||
|
tm struct from Linux's time.h:
|
||||||
|
|
||||||
|
struct tm {
|
||||||
|
int tm_sec;
|
||||||
|
int tm_min;
|
||||||
|
int tm_hour;
|
||||||
|
int tm_mday;
|
||||||
|
int tm_mon;
|
||||||
|
int tm_year;
|
||||||
|
int tm_wday;
|
||||||
|
int tm_yday;
|
||||||
|
int tm_isdst;
|
||||||
|
/* Those are for future use. */
|
||||||
|
long int __tm_gmtoff__;
|
||||||
|
__const char *__tm_zone__;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
ffi_type tm_type;
|
||||||
|
ffi_type *tm_type_elements[12];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
tm_type.size = tm_type.alignment = 0;
|
||||||
|
tm_type.elements = &tm_type_elements;
|
||||||
|
|
||||||
|
for (i = 0; i < 9; i++)
|
||||||
|
tm_type_elements[i] = &ffi_type_sint;
|
||||||
|
|
||||||
|
tm_type_elements[9] = &ffi_type_slong;
|
||||||
|
tm_type_elements[10] = &ffi_type_pointer;
|
||||||
|
tm_type_elements[11] = NULL;
|
||||||
|
|
||||||
|
/* tm_type can now be used to represent tm argument types and
|
||||||
|
return types for ffi_prep_cif() */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Platform Specific Notes
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Intel x86
|
||||||
|
---------
|
||||||
|
|
||||||
|
There are no known problems with the x86 port.
|
||||||
|
|
||||||
|
Sun Sparc - SunOS 4.1.3 & Solaris 2.x
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
There's a bug in the structure passing code for sparc processors.
|
||||||
|
Struct arguments that are passed in value actually end up being passed
|
||||||
|
by reference. This will be fixed Real Soon Now.
|
||||||
|
|
||||||
|
"long long" values are not supported yet.
|
||||||
|
|
||||||
|
You must use GNU Make to build libffi on Sun platforms.
|
||||||
|
|
||||||
|
MIPS - Irix 5.3 & 6.x
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Irix 6.2 and better supports three different calling conventions: o32,
|
||||||
|
n32 and n64. Currently, libffi only supports both o32 and n32 under
|
||||||
|
Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be
|
||||||
|
configured for whichever calling convention it was built for.
|
||||||
|
|
||||||
|
By default, the configure script will try to build libffi with the GNU
|
||||||
|
development tools. To build libffi with the SGI development tools, set
|
||||||
|
the environment variable CC to either "cc -32" or "cc -n32" before
|
||||||
|
running configure under Irix 6.x (depending on whether you want an o32
|
||||||
|
or n32 library), or just "cc" for Irix 5.3.
|
||||||
|
|
||||||
|
With the n32 calling convention, when returning structures smaller
|
||||||
|
than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned.
|
||||||
|
Here's one way of forcing this:
|
||||||
|
|
||||||
|
double struct_storage[2];
|
||||||
|
my_small_struct *s = (my_small_struct *) struct_storage;
|
||||||
|
/* Use s for RVALUE */
|
||||||
|
|
||||||
|
If you don't do this you are liable to get spurious bus errors.
|
||||||
|
|
||||||
|
"long long" values are not supported yet.
|
||||||
|
|
||||||
|
You must use GNU Make to build libffi on SGI platforms.
|
||||||
|
|
||||||
|
ARM - System V ABI
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The ARM port was performed on a NetWinder running ARM Linux ELF
|
||||||
|
(2.0.31) and gcc 2.8.1. config.sub still does not recognize the
|
||||||
|
machine name sa110-unknown-linux-gnu (currently returned by
|
||||||
|
NetWinder). In the mean time the package can be configured by running
|
||||||
|
'configure arm-linux'.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PowerPC System V ABI
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
There are two `System V ABI's which libffi implements for PowerPC.
|
||||||
|
They differ only in how small structures are returned from functions.
|
||||||
|
|
||||||
|
In the FFI_SYSV version, structures that are 8 bytes or smaller are
|
||||||
|
returned in registers. This is what GCC does when it is configured
|
||||||
|
for solaris, and is what the System V ABI I have (dated September
|
||||||
|
1995) says.
|
||||||
|
|
||||||
|
In the FFI_GCC_SYSV version, all structures are returned the same way:
|
||||||
|
by passing a pointer as the first argument to the function. This is
|
||||||
|
what GCC does when it is configured for linux or a generic sysv
|
||||||
|
target.
|
||||||
|
|
||||||
|
EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a
|
||||||
|
inconsistency with the SysV ABI: When a procedure is called with many
|
||||||
|
floating-point arguments, some of them get put on the stack. They are
|
||||||
|
all supposed to be stored in double-precision format, even if they are
|
||||||
|
only single-precision, but EGCS stores single-precision arguments as
|
||||||
|
single-precision anyway. This causes one test to fail (the `many
|
||||||
|
arguments' test).
|
||||||
|
|
||||||
|
|
||||||
|
What's With The Crazy Comments?
|
||||||
|
===============================
|
||||||
|
|
||||||
|
You might notice a number of cryptic comments in the code, delimited
|
||||||
|
by /*@ and @*/. These are annotations read by the program LCLint, a
|
||||||
|
tool for statically checking C programs. You can read all about it at
|
||||||
|
<http://larch-www.lcs.mit.edu:8001/larch/lclint/index.html>.
|
||||||
|
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
1.20 Oct-5-98
|
||||||
|
Raffaele Sena produces ARM port.
|
||||||
|
|
||||||
|
1.19 Oct-5-98
|
||||||
|
Fixed x86 long double and long long return support.
|
||||||
|
m68k bug fixes from Andreas Schwab.
|
||||||
|
Patch for DU assembler compatibility for the Alpha from Richard
|
||||||
|
Henderson.
|
||||||
|
|
||||||
|
1.18 Apr-17-98
|
||||||
|
Bug fixes and MIPS configuration changes.
|
||||||
|
|
||||||
|
1.17 Feb-24-98
|
||||||
|
Bug fixes and m68k port from Andreas Schwab. PowerPC port from
|
||||||
|
Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
|
||||||
|
|
||||||
|
1.16 Feb-11-98
|
||||||
|
Richard Henderson produces Alpha port.
|
||||||
|
|
||||||
|
1.15 Dec-4-97
|
||||||
|
Fixed an n32 ABI bug. New libtool, auto* support.
|
||||||
|
|
||||||
|
1.14 May-13-97
|
||||||
|
libtool is now used to generate shared and static libraries.
|
||||||
|
Fixed a minor portability problem reported by Russ McManus
|
||||||
|
<mcmanr@eq.gs.com>.
|
||||||
|
|
||||||
|
1.13 Dec-2-96
|
||||||
|
Added --enable-purify-safety to keep Purify from complaining
|
||||||
|
about certain low level code.
|
||||||
|
Sparc fix for calling functions with < 6 args.
|
||||||
|
Linux x86 a.out fix.
|
||||||
|
|
||||||
|
1.12 Nov-22-96
|
||||||
|
Added missing ffi_type_void, needed for supporting void return
|
||||||
|
types. Fixed test case for non MIPS machines. Cygnus Support
|
||||||
|
is now Cygnus Solutions.
|
||||||
|
|
||||||
|
1.11 Oct-30-96
|
||||||
|
Added notes about GNU make.
|
||||||
|
|
||||||
|
1.10 Oct-29-96
|
||||||
|
Added configuration fix for non GNU compilers.
|
||||||
|
|
||||||
|
1.09 Oct-29-96
|
||||||
|
Added --enable-debug configure switch. Clean-ups based on LCLint
|
||||||
|
feedback. ffi_mips.h is always installed. Many configuration
|
||||||
|
fixes. Fixed ffitest.c for sparc builds.
|
||||||
|
|
||||||
|
1.08 Oct-15-96
|
||||||
|
Fixed n32 problem. Many clean-ups.
|
||||||
|
|
||||||
|
1.07 Oct-14-96
|
||||||
|
Gordon Irlam rewrites v8.S again. Bug fixes.
|
||||||
|
|
||||||
|
1.06 Oct-14-96
|
||||||
|
Gordon Irlam improved the sparc port.
|
||||||
|
|
||||||
|
1.05 Oct-14-96
|
||||||
|
Interface changes based on feedback.
|
||||||
|
|
||||||
|
1.04 Oct-11-96
|
||||||
|
Sparc port complete (modulo struct passing bug).
|
||||||
|
|
||||||
|
1.03 Oct-10-96
|
||||||
|
Passing struct args, and returning struct values works for
|
||||||
|
all architectures/calling conventions. Expanded tests.
|
||||||
|
|
||||||
|
1.02 Oct-9-96
|
||||||
|
Added SGI n32 support. Fixed bugs in both o32 and Linux support.
|
||||||
|
Added "make test".
|
||||||
|
|
||||||
|
1.01 Oct-8-96
|
||||||
|
Fixed float passing bug in mips version. Restructured some
|
||||||
|
of the code. Builds cleanly with SGI tools.
|
||||||
|
|
||||||
|
1.00 Oct-7-96
|
||||||
|
First release. No public announcement.
|
||||||
|
|
||||||
|
|
||||||
|
Authors & Credits
|
||||||
|
=================
|
||||||
|
|
||||||
|
libffi was written by Anthony Green <green@cygnus.com>.
|
||||||
|
|
||||||
|
Portions of libffi were derived from Gianni Mariani's free gencall
|
||||||
|
library for Silicon Graphics machines.
|
||||||
|
|
||||||
|
The Sparc port was derived from code contributed by the fine folks at
|
||||||
|
Visible Decisions Inc <http://www.vdi.com>. Further enhancements were
|
||||||
|
made by Gordon Irlam at Cygnus Solutions <http://www.cygnus.com>.
|
||||||
|
|
||||||
|
The Alpha port was written by Richard Henderson at Cygnus Solutions.
|
||||||
|
|
||||||
|
Andreas Schwab ported libffi to m68k Linux and provided a number of
|
||||||
|
bug fixes.
|
||||||
|
|
||||||
|
Geoffrey Keating ported libffi to the PowerPC.
|
||||||
|
|
||||||
|
Raffaele Sena ported libffi to the ARM.
|
||||||
|
|
||||||
|
Jesper Skov and Andrew Haley both did more than their fair share of
|
||||||
|
stepping through the code and tracking down bugs.
|
||||||
|
|
||||||
|
Thanks also to Tom Tromey for bug fixes and configuration help.
|
||||||
|
|
||||||
|
Thanks to Jim Blandy, who provided some useful feedback on the libffi
|
||||||
|
interface.
|
||||||
|
|
||||||
|
If you have a problem, or have found a bug, please send a note to
|
||||||
|
green@cygnus.com.
|
||||||
13
libffi/acconfig.h
Normal file
13
libffi/acconfig.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/* Define this if you want extra debugging */
|
||||||
|
#undef FFI_DEBUG
|
||||||
|
|
||||||
|
/* Define this if you are using Purify and want to suppress
|
||||||
|
spurious messages. */
|
||||||
|
#undef USING_PURIFY
|
||||||
|
|
||||||
|
/* This is the package name */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* This is the package version */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
366
libffi/aclocal.m4
vendored
Normal file
366
libffi/aclocal.m4
vendored
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
dnl aclocal.m4 generated automatically by aclocal 1.2
|
||||||
|
|
||||||
|
# Like AC_CONFIG_HEADER, but automatically create stamp file.
|
||||||
|
|
||||||
|
AC_DEFUN(AM_CONFIG_HEADER,
|
||||||
|
[AC_PREREQ([2.12])
|
||||||
|
AC_CONFIG_HEADER([$1])
|
||||||
|
dnl When config.status generates a header, we must update the stamp-h file.
|
||||||
|
dnl This file resides in the same directory as the config header
|
||||||
|
dnl that is generated. We must strip everything past the first ":",
|
||||||
|
dnl and everything past the last "/".
|
||||||
|
AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
|
||||||
|
ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
|
||||||
|
<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
|
||||||
|
<<am_indx=1
|
||||||
|
for am_file in <<$1>>; do
|
||||||
|
case " <<$>>CONFIG_HEADERS " in
|
||||||
|
*" <<$>>am_file "*<<)>>
|
||||||
|
echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
am_indx=`expr "<<$>>am_indx" + 1`
|
||||||
|
done<<>>dnl>>)
|
||||||
|
changequote([,]))])
|
||||||
|
|
||||||
|
# Do all the work for Automake. This macro actually does too much --
|
||||||
|
# some checks are only needed if your package does certain things.
|
||||||
|
# But this isn't really a big deal.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
dnl Usage:
|
||||||
|
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
|
||||||
|
|
||||||
|
AC_DEFUN(AM_INIT_AUTOMAKE,
|
||||||
|
[AC_REQUIRE([AM_PROG_INSTALL])
|
||||||
|
PACKAGE=[$1]
|
||||||
|
AC_SUBST(PACKAGE)
|
||||||
|
VERSION=[$2]
|
||||||
|
AC_SUBST(VERSION)
|
||||||
|
dnl test to see if srcdir already configured
|
||||||
|
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
|
||||||
|
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
||||||
|
fi
|
||||||
|
ifelse([$3],,
|
||||||
|
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
|
||||||
|
AC_DEFINE_UNQUOTED(VERSION, "$VERSION"))
|
||||||
|
AM_SANITY_CHECK
|
||||||
|
AC_ARG_PROGRAM
|
||||||
|
dnl FIXME This is truly gross.
|
||||||
|
missing_dir=`cd $ac_aux_dir && pwd`
|
||||||
|
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
|
||||||
|
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
|
||||||
|
AC_PROG_MAKE_SET])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_INSTALL,
|
||||||
|
[AC_REQUIRE([AC_PROG_INSTALL])
|
||||||
|
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
|
||||||
|
AC_SUBST(INSTALL_SCRIPT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check to make sure that the build environment is sane.
|
||||||
|
#
|
||||||
|
|
||||||
|
AC_DEFUN(AM_SANITY_CHECK,
|
||||||
|
[AC_MSG_CHECKING([whether build environment is sane])
|
||||||
|
# Just in case
|
||||||
|
sleep 1
|
||||||
|
echo timestamp > conftestfile
|
||||||
|
# Do `set' in a subshell so we don't clobber the current shell's
|
||||||
|
# arguments. Must try -L first in case configure is actually a
|
||||||
|
# symlink; some systems play weird games with the mod time of symlinks
|
||||||
|
# (eg FreeBSD returns the mod time of the symlink's containing
|
||||||
|
# directory).
|
||||||
|
if (
|
||||||
|
set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
|
||||||
|
if test "$@" = "X"; then
|
||||||
|
# -L didn't work.
|
||||||
|
set X `ls -t $srcdir/configure conftestfile`
|
||||||
|
fi
|
||||||
|
test "[$]2" = conftestfile
|
||||||
|
)
|
||||||
|
then
|
||||||
|
# Ok.
|
||||||
|
:
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([newly created file is older than distributed files!
|
||||||
|
Check your system clock])
|
||||||
|
fi
|
||||||
|
rm -f conftest*
|
||||||
|
AC_MSG_RESULT(yes)])
|
||||||
|
|
||||||
|
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
|
||||||
|
dnl The program must properly implement --version.
|
||||||
|
AC_DEFUN(AM_MISSING_PROG,
|
||||||
|
[AC_MSG_CHECKING(for working $2)
|
||||||
|
# Run test in a subshell; some versions of sh will print an error if
|
||||||
|
# an executable is not found, even if stderr is redirected.
|
||||||
|
# Redirect stdin to placate older versions of autoconf. Sigh.
|
||||||
|
if ($2 --version) < /dev/null > /dev/null 2>&1; then
|
||||||
|
$1=$2
|
||||||
|
AC_MSG_RESULT(found)
|
||||||
|
else
|
||||||
|
$1="$3/missing $2"
|
||||||
|
AC_MSG_RESULT(missing)
|
||||||
|
fi
|
||||||
|
AC_SUBST($1)])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 24 AM_PROG_LIBTOOL
|
||||||
|
AC_DEFUN(AM_PROG_LIBTOOL,
|
||||||
|
[AC_REQUIRE([AM_ENABLE_SHARED])dnl
|
||||||
|
AC_REQUIRE([AM_ENABLE_STATIC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_RANLIB])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AM_PROG_LD])dnl
|
||||||
|
AC_REQUIRE([AM_PROG_NM])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_LN_S])dnl
|
||||||
|
dnl
|
||||||
|
# Always use our own libtool.
|
||||||
|
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
|
||||||
|
AC_SUBST(LIBTOOL)dnl
|
||||||
|
|
||||||
|
# Check for any special flags to pass to ltconfig.
|
||||||
|
libtool_flags=
|
||||||
|
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
|
||||||
|
test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
|
||||||
|
test "$silent" = yes && libtool_flags="$libtool_flags --silent"
|
||||||
|
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
|
||||||
|
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
|
||||||
|
|
||||||
|
# Some flags need to be propagated to the compiler or linker for good
|
||||||
|
# libtool support.
|
||||||
|
case "$host" in
|
||||||
|
*-*-irix6*)
|
||||||
|
# Find out which ABI we are using.
|
||||||
|
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
|
||||||
|
if AC_TRY_EVAL(ac_compile); then
|
||||||
|
case "`/usr/bin/file conftest.o`" in
|
||||||
|
*32-bit*)
|
||||||
|
LD="${LD-ld} -32"
|
||||||
|
;;
|
||||||
|
*N32*)
|
||||||
|
LD="${LD-ld} -n32"
|
||||||
|
;;
|
||||||
|
*64-bit*)
|
||||||
|
LD="${LD-ld} -64"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
rm -rf conftest*
|
||||||
|
;;
|
||||||
|
|
||||||
|
*-*-sco3.2v5*)
|
||||||
|
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
|
||||||
|
CFLAGS="$CFLAGS -belf"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Actually configure libtool. ac_aux_dir is where install-sh is found.
|
||||||
|
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
|
||||||
|
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
|
||||||
|
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
|
||||||
|
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
|
||||||
|
|| AC_MSG_ERROR([libtool configure failed])
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_ENABLE_SHARED - implement the --enable-shared flag
|
||||||
|
# Usage: AM_ENABLE_SHARED[(DEFAULT)]
|
||||||
|
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||||
|
# `yes'.
|
||||||
|
AC_DEFUN(AM_ENABLE_SHARED,
|
||||||
|
[define([AM_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||||
|
AC_ARG_ENABLE(shared,
|
||||||
|
changequote(<<, >>)dnl
|
||||||
|
<< --enable-shared build shared libraries [default=>>AM_ENABLE_SHARED_DEFAULT]
|
||||||
|
changequote([, ])dnl
|
||||||
|
[ --enable-shared=PKGS only build shared libraries if the current package
|
||||||
|
appears as an element in the PKGS list],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case "$enableval" in
|
||||||
|
yes) enable_shared=yes ;;
|
||||||
|
no) enable_shared=no ;;
|
||||||
|
*)
|
||||||
|
enable_shared=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_shared=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
enable_shared=AM_ENABLE_SHARED_DEFAULT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_DISABLE_SHARED - set the default shared flag to --disable-shared
|
||||||
|
AC_DEFUN(AM_DISABLE_SHARED,
|
||||||
|
[AM_ENABLE_SHARED(no)])
|
||||||
|
|
||||||
|
# AM_DISABLE_STATIC - set the default static flag to --disable-static
|
||||||
|
AC_DEFUN(AM_DISABLE_STATIC,
|
||||||
|
[AM_ENABLE_STATIC(no)])
|
||||||
|
|
||||||
|
# AM_ENABLE_STATIC - implement the --enable-static flag
|
||||||
|
# Usage: AM_ENABLE_STATIC[(DEFAULT)]
|
||||||
|
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||||
|
# `yes'.
|
||||||
|
AC_DEFUN(AM_ENABLE_STATIC,
|
||||||
|
[define([AM_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||||
|
AC_ARG_ENABLE(static,
|
||||||
|
changequote(<<, >>)dnl
|
||||||
|
<< --enable-static build static libraries [default=>>AM_ENABLE_STATIC_DEFAULT]
|
||||||
|
changequote([, ])dnl
|
||||||
|
[ --enable-static=PKGS only build shared libraries if the current package
|
||||||
|
appears as an element in the PKGS list],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case "$enableval" in
|
||||||
|
yes) enable_static=yes ;;
|
||||||
|
no) enable_static=no ;;
|
||||||
|
*)
|
||||||
|
enable_static=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_static=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
enable_static=AM_ENABLE_STATIC_DEFAULT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# AM_PROG_LD - find the path to the GNU or non-GNU linker
|
||||||
|
AC_DEFUN(AM_PROG_LD,
|
||||||
|
[AC_ARG_WITH(gnu-ld,
|
||||||
|
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
|
||||||
|
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
ac_prog=ld
|
||||||
|
if test "$ac_cv_prog_gcc" = yes; then
|
||||||
|
# Check if gcc -print-prog-name=ld gives a path.
|
||||||
|
AC_MSG_CHECKING([for ld used by GCC])
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5`
|
||||||
|
case "$ac_prog" in
|
||||||
|
# Accept absolute paths.
|
||||||
|
/* | [A-Za-z]:\\*)
|
||||||
|
test -z "$LD" && LD="$ac_prog"
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
# If it fails, then pretend we aren't using GCC.
|
||||||
|
ac_prog=ld
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# If it is relative, then search for the first ld in PATH.
|
||||||
|
with_gnu_ld=unknown
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
elif test "$with_gnu_ld" = yes; then
|
||||||
|
AC_MSG_CHECKING([for GNU ld])
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING([for non-GNU ld])
|
||||||
|
fi
|
||||||
|
AC_CACHE_VAL(ac_cv_path_LD,
|
||||||
|
[if test -z "$LD"; then
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in $PATH; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f "$ac_dir/$ac_prog"; then
|
||||||
|
ac_cv_path_LD="$ac_dir/$ac_prog"
|
||||||
|
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||||
|
# but apparently some GNU ld's only accept -v.
|
||||||
|
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||||
|
if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
|
||||||
|
test "$with_gnu_ld" != no && break
|
||||||
|
else
|
||||||
|
test "$with_gnu_ld" != yes && break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
else
|
||||||
|
ac_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||||
|
fi])
|
||||||
|
LD="$ac_cv_path_LD"
|
||||||
|
if test -n "$LD"; then
|
||||||
|
AC_MSG_RESULT($LD)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||||
|
AC_SUBST(LD)
|
||||||
|
AM_PROG_LD_GNU
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_LD_GNU,
|
||||||
|
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
|
||||||
|
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
|
||||||
|
if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
|
||||||
|
ac_cv_prog_gnu_ld=yes
|
||||||
|
else
|
||||||
|
ac_cv_prog_gnu_ld=no
|
||||||
|
fi])
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_PROG_NM - find the path to a BSD-compatible name lister
|
||||||
|
AC_DEFUN(AM_PROG_NM,
|
||||||
|
[AC_MSG_CHECKING([for BSD-compatible nm])
|
||||||
|
AC_CACHE_VAL(ac_cv_path_NM,
|
||||||
|
[case "$NM" in
|
||||||
|
/* | [A-Za-z]:\\*)
|
||||||
|
ac_cv_path_NM="$NM" # Let the user override the test with a path.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f $ac_dir/nm; then
|
||||||
|
# Check to see if the nm accepts a BSD-compat flag.
|
||||||
|
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
|
||||||
|
# nm: unknown option "B" ignored
|
||||||
|
if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
|
||||||
|
ac_cv_path_NM="$ac_dir/nm -B"
|
||||||
|
elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
|
||||||
|
ac_cv_path_NM="$ac_dir/nm -p"
|
||||||
|
else
|
||||||
|
ac_cv_path_NM="$ac_dir/nm"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
|
||||||
|
;;
|
||||||
|
esac])
|
||||||
|
NM="$ac_cv_path_NM"
|
||||||
|
AC_MSG_RESULT([$NM])
|
||||||
|
AC_SUBST(NM)
|
||||||
|
])
|
||||||
|
|
||||||
|
# Define a conditional.
|
||||||
|
|
||||||
|
AC_DEFUN(AM_CONDITIONAL,
|
||||||
|
[AC_SUBST($1_TRUE)
|
||||||
|
AC_SUBST($1_FALSE)
|
||||||
|
if $2; then
|
||||||
|
$1_TRUE=
|
||||||
|
$1_FALSE='#'
|
||||||
|
else
|
||||||
|
$1_TRUE='#'
|
||||||
|
$1_FALSE=
|
||||||
|
fi])
|
||||||
|
|
||||||
883
libffi/config.guess
vendored
Executable file
883
libffi/config.guess
vendored
Executable file
@@ -0,0 +1,883 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Attempt to guess a canonical system name.
|
||||||
|
# Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Written by Per Bothner <bothner@cygnus.com>.
|
||||||
|
# The master version of this file is at the FSF in /home/gd/gnu/lib.
|
||||||
|
#
|
||||||
|
# This script attempts to guess a canonical system name similar to
|
||||||
|
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||||
|
# exits with 0. Otherwise, it exits with 1.
|
||||||
|
#
|
||||||
|
# The plan is that this can be called by configure scripts if you
|
||||||
|
# don't specify an explicit system type (host/target name).
|
||||||
|
#
|
||||||
|
# Only a few systems have been added to this list; please add others
|
||||||
|
# (but try to keep the structure clean).
|
||||||
|
#
|
||||||
|
|
||||||
|
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
|
||||||
|
# (ghazi@noc.rutgers.edu 8/24/94.)
|
||||||
|
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
|
||||||
|
PATH=$PATH:/.attbin ; export PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
|
||||||
|
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
|
||||||
|
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
|
||||||
|
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||||
|
|
||||||
|
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
|
||||||
|
|
||||||
|
# Note: order is significant - the case branches are not exclusive.
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||||
|
alpha:OSF1:*:*)
|
||||||
|
if test $UNAME_RELEASE = "V4.0"; then
|
||||||
|
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||||
|
fi
|
||||||
|
# A Vn.n version is a released version.
|
||||||
|
# A Tn.n version is a released field test version.
|
||||||
|
# A Xn.n version is an unreleased experimental baselevel.
|
||||||
|
# 1.2 uses "1.2" for uname -r.
|
||||||
|
cat <<EOF >dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
rm -f dummy.s dummy
|
||||||
|
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
|
||||||
|
exit 0 ;;
|
||||||
|
21064:Windows_NT:50:3)
|
||||||
|
echo alpha-dec-winnt3.5
|
||||||
|
exit 0 ;;
|
||||||
|
Amiga*:UNIX_System_V:4.0:*)
|
||||||
|
echo m68k-cbm-sysv4
|
||||||
|
exit 0;;
|
||||||
|
amiga:NetBSD:*:*)
|
||||||
|
echo m68k-cbm-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
amiga:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arc64:OpenBSD:*:*)
|
||||||
|
echo mips64el-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
hkmips:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
pmax:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sgi:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
wgrisc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||||
|
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||||
|
exit 0;;
|
||||||
|
arm32:NetBSD:*:*)
|
||||||
|
echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
SR2?01:HI-UX/MPP:*:*)
|
||||||
|
echo hppa1.1-hitachi-hiuxmpp
|
||||||
|
exit 0;;
|
||||||
|
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
|
||||||
|
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
|
||||||
|
if test "`(/bin/universe) 2>/dev/null`" = att ; then
|
||||||
|
echo pyramid-pyramid-sysv3
|
||||||
|
else
|
||||||
|
echo pyramid-pyramid-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
NILE:*:*:dcosx)
|
||||||
|
echo pyramid-pyramid-svr4
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||||
|
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
i86pc:SunOS:5.*:*)
|
||||||
|
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:6*:*)
|
||||||
|
# According to config.sub, this is the proper way to canonicalize
|
||||||
|
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
|
||||||
|
# it's likely to be more like Solaris than SunOS4.
|
||||||
|
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:*:*)
|
||||||
|
case "`/usr/bin/arch -k`" in
|
||||||
|
Series*|S4*)
|
||||||
|
UNAME_RELEASE=`uname -v`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Japanese Language versions have a version number like `4.1.3-JL'.
|
||||||
|
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:SunOS:*:*)
|
||||||
|
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun*:*:4.2BSD:*)
|
||||||
|
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
|
||||||
|
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
|
||||||
|
case "`/bin/arch`" in
|
||||||
|
sun3)
|
||||||
|
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
sun4)
|
||||||
|
echo sparc-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit 0 ;;
|
||||||
|
aushp:SunOS:*:*)
|
||||||
|
echo sparc-auspex-sunos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
atari*:NetBSD:*:*)
|
||||||
|
echo m68k-atari-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
atari*:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:NetBSD:*:*)
|
||||||
|
echo m68k-sun-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:NetBSD:*:*)
|
||||||
|
echo m68k-apple-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme88k:OpenBSD:*:*)
|
||||||
|
echo m88k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
powerpc:machten:*:*)
|
||||||
|
echo powerpc-apple-machten${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
RISC*:Mach:*:*)
|
||||||
|
echo mips-dec-mach_bsd4.3
|
||||||
|
exit 0 ;;
|
||||||
|
RISC*:ULTRIX:*:*)
|
||||||
|
echo mips-dec-ultrix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
VAX*:ULTRIX*:*:*)
|
||||||
|
echo vax-dec-ultrix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
2020:CLIX:*:*)
|
||||||
|
echo clipper-intergraph-clix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mips:*:*:UMIPS | mips:*:*:RISCos)
|
||||||
|
sed 's/^ //' << EOF >dummy.c
|
||||||
|
int main (argc, argv) int argc; char **argv; {
|
||||||
|
#if defined (host_mips) && defined (MIPSEB)
|
||||||
|
#if defined (SYSTYPE_SYSV)
|
||||||
|
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (SYSTYPE_SVR4)
|
||||||
|
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
|
||||||
|
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.c -o dummy \
|
||||||
|
&& ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
|
||||||
|
&& rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
echo mips-mips-riscos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
Night_Hawk:Power_UNIX:*:*)
|
||||||
|
echo powerpc-harris-powerunix
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:CX/UX:7*:*)
|
||||||
|
echo m88k-harris-cxux7
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:*:4*:R4*)
|
||||||
|
echo m88k-motorola-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:*:3*:R3*)
|
||||||
|
echo m88k-motorola-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
AViiON:dgux:*:*)
|
||||||
|
# DG/UX returns AViiON for all architectures
|
||||||
|
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||||
|
if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
|
||||||
|
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
|
||||||
|
-o ${TARGET_BINARY_INTERFACE}x = x ] ; then
|
||||||
|
echo m88k-dg-dgux${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo m88k-dg-dguxbcs${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
else echo i586-dg-dgux${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||||
|
echo m88k-dolphin-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
M88*:*:R3*:*)
|
||||||
|
# Delta 88k system running SVR3
|
||||||
|
echo m88k-motorola-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
|
||||||
|
echo m88k-tektronix-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
|
||||||
|
echo m68k-tektronix-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
*:IRIX*:*:*)
|
||||||
|
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
|
||||||
|
exit 0 ;;
|
||||||
|
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
|
||||||
|
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
|
||||||
|
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
|
||||||
|
i?86:AIX:*:*)
|
||||||
|
echo i386-ibm-aix
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:2:3)
|
||||||
|
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||||
|
sed 's/^ //' << EOF >dummy.c
|
||||||
|
#include <sys/systemcfg.h>
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
if (!__power_pc())
|
||||||
|
exit(1);
|
||||||
|
puts("powerpc-ibm-aix3.2.5");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
echo rs6000-ibm-aix3.2.5
|
||||||
|
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||||
|
echo rs6000-ibm-aix3.2.4
|
||||||
|
else
|
||||||
|
echo rs6000-ibm-aix3.2
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:*:4)
|
||||||
|
if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
|
||||||
|
IBM_ARCH=rs6000
|
||||||
|
else
|
||||||
|
IBM_ARCH=powerpc
|
||||||
|
fi
|
||||||
|
if [ -x /usr/bin/oslevel ] ; then
|
||||||
|
IBM_REV=`/usr/bin/oslevel`
|
||||||
|
else
|
||||||
|
IBM_REV=4.${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:*:*)
|
||||||
|
echo rs6000-ibm-aix
|
||||||
|
exit 0 ;;
|
||||||
|
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
|
||||||
|
echo romp-ibm-bsd4.4
|
||||||
|
exit 0 ;;
|
||||||
|
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
|
||||||
|
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
|
||||||
|
exit 0 ;; # report: romp-ibm BSD 4.3
|
||||||
|
*:BOSX:*:*)
|
||||||
|
echo rs6000-bull-bosx
|
||||||
|
exit 0 ;;
|
||||||
|
DPX/2?00:B.O.S.:*:*)
|
||||||
|
echo m68k-bull-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
9000/[34]??:4.3bsd:1.*:*)
|
||||||
|
echo m68k-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
|
||||||
|
echo m68k-hp-bsd4.4
|
||||||
|
exit 0 ;;
|
||||||
|
9000/[3478]??:HP-UX:*:*)
|
||||||
|
case "${UNAME_MACHINE}" in
|
||||||
|
9000/31? ) HP_ARCH=m68000 ;;
|
||||||
|
9000/[34]?? ) HP_ARCH=m68k ;;
|
||||||
|
9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
|
||||||
|
9000/8?? ) HP_ARCH=hppa1.0 ;;
|
||||||
|
esac
|
||||||
|
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
|
||||||
|
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
|
||||||
|
exit 0 ;;
|
||||||
|
3050*:HI-UX:*:*)
|
||||||
|
sed 's/^ //' << EOF >dummy.c
|
||||||
|
#include <unistd.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
long cpu = sysconf (_SC_CPU_VERSION);
|
||||||
|
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
|
||||||
|
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
|
||||||
|
results, however. */
|
||||||
|
if (CPU_IS_PA_RISC (cpu))
|
||||||
|
{
|
||||||
|
switch (cpu)
|
||||||
|
{
|
||||||
|
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
|
||||||
|
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
|
||||||
|
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
|
||||||
|
default: puts ("hppa-hitachi-hiuxwe2"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (CPU_IS_HP_MC68K (cpu))
|
||||||
|
puts ("m68k-hitachi-hiuxwe2");
|
||||||
|
else puts ("unknown-hitachi-hiuxwe2");
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
echo unknown-hitachi-hiuxwe2
|
||||||
|
exit 0 ;;
|
||||||
|
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
|
||||||
|
echo hppa1.1-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
9000/8??:4.3bsd:*:*)
|
||||||
|
echo hppa1.0-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
||||||
|
echo hppa1.1-hp-osf
|
||||||
|
exit 0 ;;
|
||||||
|
hp8??:OSF1:*:*)
|
||||||
|
echo hppa1.0-hp-osf
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:OSF1:*:*)
|
||||||
|
if [ -x /usr/sbin/sysversion ] ; then
|
||||||
|
echo ${UNAME_MACHINE}-unknown-osf1mk
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-unknown-osf1
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
parisc*:Lites*:*:*)
|
||||||
|
echo hppa1.1-hp-lites
|
||||||
|
exit 0 ;;
|
||||||
|
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||||
|
echo c1-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||||
|
if getsysinfo -f scalar_acc
|
||||||
|
then echo c32-convex-bsd
|
||||||
|
else echo c2-convex-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||||
|
echo c34-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||||
|
echo c38-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||||
|
echo c4-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*X-MP:*:*:*)
|
||||||
|
echo xmp-cray-unicos
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*Y-MP:*:*:*)
|
||||||
|
echo ymp-cray-unicos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*[A-Z]90:*:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
||||||
|
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
||||||
|
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*TS:*:*:*)
|
||||||
|
echo t90-cray-unicos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY-2:*:*:*)
|
||||||
|
echo cray2-cray-unicos
|
||||||
|
exit 0 ;;
|
||||||
|
F300:UNIX_System_V:*:*)
|
||||||
|
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
|
||||||
|
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||||
|
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||||
|
exit 0 ;;
|
||||||
|
F301:UNIX_System_V:*:*)
|
||||||
|
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
hp3[0-9][05]:NetBSD:*:*)
|
||||||
|
echo m68k-hp-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
hp300:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:BSD/386:*:* | *:BSD/OS:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
*:FreeBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:NetBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:OpenBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
i*:CYGWIN*:*)
|
||||||
|
echo i386-pc-cygwin32
|
||||||
|
exit 0 ;;
|
||||||
|
i*:MINGW*:*)
|
||||||
|
echo i386-pc-mingw32
|
||||||
|
exit 0 ;;
|
||||||
|
p*:CYGWIN*:*)
|
||||||
|
echo powerpcle-unknown-cygwin32
|
||||||
|
exit 0 ;;
|
||||||
|
prep*:SunOS:5.*:*)
|
||||||
|
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:GNU:*:*)
|
||||||
|
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:Linux:*:*)
|
||||||
|
# The BFD linker knows what the default object file format is, so
|
||||||
|
# first see if it will tell us.
|
||||||
|
ld_help_string=`ld --help 2>&1`
|
||||||
|
ld_supported_emulations=`echo $ld_help_string \
|
||||||
|
| sed -ne '/supported emulations:/!d
|
||||||
|
s/[ ][ ]*/ /g
|
||||||
|
s/.*supported emulations: *//
|
||||||
|
s/ .*//
|
||||||
|
p'`
|
||||||
|
case "$ld_supported_emulations" in
|
||||||
|
i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
|
||||||
|
i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
|
||||||
|
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test "${UNAME_MACHINE}" = "alpha" ; then
|
||||||
|
sed 's/^ //' <<EOF >dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
LIBC=""
|
||||||
|
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
objdump --private-headers dummy | \
|
||||||
|
grep ld.so.1 > /dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
LIBC="libc1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f dummy.s dummy
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
|
||||||
|
elif test "${UNAME_MACHINE}" = "mips" ; then
|
||||||
|
cat >dummy.c <<EOF
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __MIPSEB__
|
||||||
|
printf ("%s-unknown-linux-gnu\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
#ifdef __MIPSEL__
|
||||||
|
printf ("%sel-unknown-linux-gnu\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
else
|
||||||
|
# Either a pre-BFD a.out linker (linux-gnuoldld)
|
||||||
|
# or one that does not give us useful --help.
|
||||||
|
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
|
||||||
|
# If ld does not provide *any* "supported emulations:"
|
||||||
|
# that means it is gnuoldld.
|
||||||
|
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
|
||||||
|
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}" in
|
||||||
|
i?86)
|
||||||
|
VENDOR=pc;
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
VENDOR=unknown;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Determine whether the default compiler is a.out or elf
|
||||||
|
cat >dummy.c <<EOF
|
||||||
|
#include <features.h>
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __ELF__
|
||||||
|
# ifdef __GLIBC__
|
||||||
|
# if __GLIBC__ >= 2
|
||||||
|
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
fi ;;
|
||||||
|
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
|
||||||
|
# are messed up and put the nodename in both sysname and nodename.
|
||||||
|
i?86:DYNIX/ptx:4*:*)
|
||||||
|
echo i386-sequent-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:UNIX_SV:4.2MP:2.*)
|
||||||
|
# Unixware is an offshoot of SVR4, but it has its own version
|
||||||
|
# number series starting with 2...
|
||||||
|
# I am not positive that other SVR4 systems won't match this,
|
||||||
|
# I just have to hope. -- rms.
|
||||||
|
# Use sysv4.2uw... so that sysv4* matches it.
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
|
||||||
|
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
|
||||||
|
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:*:3.2:*)
|
||||||
|
if test -f /usr/options/cb.name; then
|
||||||
|
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
|
||||||
|
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
|
||||||
|
elif /bin/uname -X 2>/dev/null >/dev/null ; then
|
||||||
|
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
|
||||||
|
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
|
||||||
|
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
|
||||||
|
&& UNAME_MACHINE=i586
|
||||||
|
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv32
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
pc:*:*:*)
|
||||||
|
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||||
|
# the processor, so we play safe by assuming i386.
|
||||||
|
echo i386-pc-msdosdjgpp
|
||||||
|
exit 0 ;;
|
||||||
|
Intel:Mach:3*:*)
|
||||||
|
echo i386-pc-mach3
|
||||||
|
exit 0 ;;
|
||||||
|
paragon:*:*:*)
|
||||||
|
echo i860-intel-osf1
|
||||||
|
exit 0 ;;
|
||||||
|
i860:*:4.*:*) # i860-SVR4
|
||||||
|
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
|
||||||
|
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
|
||||||
|
else # Add other i860-SVR4 vendors below as they are discovered.
|
||||||
|
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
mini*:CTIX:SYS*5:*)
|
||||||
|
# "miniframe"
|
||||||
|
echo m68010-convergent-sysv
|
||||||
|
exit 0 ;;
|
||||||
|
M68*:*:R3V[567]*:*)
|
||||||
|
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
||||||
|
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
|
||||||
|
OS_REL=''
|
||||||
|
test -r /etc/.relid \
|
||||||
|
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||||
|
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||||
|
&& echo i486-ncr-sysv4.3${OS_REL} && exit 0
|
||||||
|
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||||
|
&& echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
|
||||||
|
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||||
|
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||||
|
&& echo i486-ncr-sysv4 && exit 0 ;;
|
||||||
|
m68*:LynxOS:2.*:*)
|
||||||
|
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mc68030:UNIX_System_V:4.*:*)
|
||||||
|
echo m68k-atari-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:LynxOS:2.*:*)
|
||||||
|
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
TSUNAMI:LynxOS:2.*:*)
|
||||||
|
echo sparc-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
|
||||||
|
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
SM[BE]S:UNIX_SV:*:*)
|
||||||
|
echo mips-dde-sysv${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
RM*:SINIX-*:*:*)
|
||||||
|
echo mips-sni-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:SINIX-*:*:*)
|
||||||
|
if uname -p 2>/dev/null >/dev/null ; then
|
||||||
|
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||||
|
echo ${UNAME_MACHINE}-sni-sysv4
|
||||||
|
else
|
||||||
|
echo ns32k-sni-sysv
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||||
|
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||||
|
echo i586-unisys-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:UNIX_System_V:4*:FTX*)
|
||||||
|
# From Gerald Hewes <hewes@openmarket.com>.
|
||||||
|
# How about differentiating between stratus architectures? -djm
|
||||||
|
echo hppa1.1-stratus-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:*:*:FTX*)
|
||||||
|
# From seanf@swdc.stratus.com.
|
||||||
|
echo i860-stratus-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
mc68*:A/UX:*:*)
|
||||||
|
echo m68k-apple-aux${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
news*:NEWS-OS:*:6*)
|
||||||
|
echo mips-sony-newsos6
|
||||||
|
exit 0 ;;
|
||||||
|
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
|
||||||
|
if [ -d /usr/nec ]; then
|
||||||
|
echo mips-nec-sysv${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||||
|
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||||
|
|
||||||
|
cat >dummy.c <<EOF
|
||||||
|
#ifdef _SEQUENT_
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/utsname.h>
|
||||||
|
#endif
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if defined (sony)
|
||||||
|
#if defined (MIPSEB)
|
||||||
|
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
|
||||||
|
I don't know.... */
|
||||||
|
printf ("mips-sony-bsd\n"); exit (0);
|
||||||
|
#else
|
||||||
|
#include <sys/param.h>
|
||||||
|
printf ("m68k-sony-newsos%s\n",
|
||||||
|
#ifdef NEWSOS4
|
||||||
|
"4"
|
||||||
|
#else
|
||||||
|
""
|
||||||
|
#endif
|
||||||
|
); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__arm) && defined (__acorn) && defined (__unix)
|
||||||
|
printf ("arm-acorn-riscix"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (hp300) && !defined (hpux)
|
||||||
|
printf ("m68k-hp-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (NeXT)
|
||||||
|
#if !defined (__ARCHITECTURE__)
|
||||||
|
#define __ARCHITECTURE__ "m68k"
|
||||||
|
#endif
|
||||||
|
int version;
|
||||||
|
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
|
||||||
|
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
|
||||||
|
exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (MULTIMAX) || defined (n16)
|
||||||
|
#if defined (UMAXV)
|
||||||
|
printf ("ns32k-encore-sysv\n"); exit (0);
|
||||||
|
#else
|
||||||
|
#if defined (CMU)
|
||||||
|
printf ("ns32k-encore-mach\n"); exit (0);
|
||||||
|
#else
|
||||||
|
printf ("ns32k-encore-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__386BSD__)
|
||||||
|
printf ("i386-pc-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (sequent)
|
||||||
|
#if defined (i386)
|
||||||
|
printf ("i386-sequent-dynix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (ns32000)
|
||||||
|
printf ("ns32k-sequent-dynix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (_SEQUENT_)
|
||||||
|
struct utsname un;
|
||||||
|
|
||||||
|
uname(&un);
|
||||||
|
|
||||||
|
if (strncmp(un.version, "V2", 2) == 0) {
|
||||||
|
printf ("i386-sequent-ptx2\n"); exit (0);
|
||||||
|
}
|
||||||
|
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
|
||||||
|
printf ("i386-sequent-ptx1\n"); exit (0);
|
||||||
|
}
|
||||||
|
printf ("i386-sequent-ptx\n"); exit (0);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (vax)
|
||||||
|
#if !defined (ultrix)
|
||||||
|
printf ("vax-dec-bsd\n"); exit (0);
|
||||||
|
#else
|
||||||
|
printf ("vax-dec-ultrix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (alliant) && defined (i860)
|
||||||
|
printf ("i860-alliant-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
|
||||||
|
rm -f dummy.c dummy
|
||||||
|
|
||||||
|
# Apollos put the system type in the environment.
|
||||||
|
|
||||||
|
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
|
||||||
|
|
||||||
|
# Convex versions that predate uname can use getsysinfo(1)
|
||||||
|
|
||||||
|
if [ -x /usr/convex/getsysinfo ]
|
||||||
|
then
|
||||||
|
case `getsysinfo -f cpu_type` in
|
||||||
|
c1*)
|
||||||
|
echo c1-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c2*)
|
||||||
|
if getsysinfo -f scalar_acc
|
||||||
|
then echo c32-convex-bsd
|
||||||
|
else echo c2-convex-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
c34*)
|
||||||
|
echo c34-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c38*)
|
||||||
|
echo c38-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c4*)
|
||||||
|
echo c4-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
#echo '(Unable to guess system type)' 1>&2
|
||||||
|
|
||||||
|
exit 1
|
||||||
954
libffi/config.sub
vendored
Executable file
954
libffi/config.sub
vendored
Executable file
@@ -0,0 +1,954 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Configuration validation subroutine script, version 1.1.
|
||||||
|
# Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
||||||
|
# This file is (in principle) common to ALL GNU software.
|
||||||
|
# The presence of a machine in this file suggests that SOME GNU software
|
||||||
|
# can handle that machine. It does not imply ALL GNU software can.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
# Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||||
|
# Supply the specified configuration type as an argument.
|
||||||
|
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||||
|
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||||
|
|
||||||
|
# This file is supposed to be the same for all GNU packages
|
||||||
|
# and recognize all the CPU types, system types and aliases
|
||||||
|
# that are meaningful with *any* GNU software.
|
||||||
|
# Each package is responsible for reporting which valid configurations
|
||||||
|
# it does not support. The user should be able to distinguish
|
||||||
|
# a failure to support a valid configuration from a meaningless
|
||||||
|
# configuration.
|
||||||
|
|
||||||
|
# The goal of this file is to map all the various variations of a given
|
||||||
|
# machine specification into a single specification in the form:
|
||||||
|
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||||
|
# or in some cases, the newer four-part form:
|
||||||
|
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||||
|
# It is wrong to echo any other type of specification.
|
||||||
|
|
||||||
|
if [ x$1 = x ]
|
||||||
|
then
|
||||||
|
echo Configuration name missing. 1>&2
|
||||||
|
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
|
||||||
|
echo "or $0 ALIAS" 1>&2
|
||||||
|
echo where ALIAS is a recognized configuration type. 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# First pass through any local machine types.
|
||||||
|
case $1 in
|
||||||
|
*local*)
|
||||||
|
echo $1
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
|
||||||
|
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||||
|
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||||
|
case $maybe_os in
|
||||||
|
linux-gnu*)
|
||||||
|
os=-$maybe_os
|
||||||
|
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||||
|
if [ $basic_machine != $1 ]
|
||||||
|
then os=`echo $1 | sed 's/.*-/-/'`
|
||||||
|
else os=; fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
### Let's recognize common machines as not being operating systems so
|
||||||
|
### that things like config.sub decstation-3100 work. We also
|
||||||
|
### recognize some manufacturers as not being operating systems, so we
|
||||||
|
### can provide default operating systems below.
|
||||||
|
case $os in
|
||||||
|
-sun*os*)
|
||||||
|
# Prevent following clause from handling this invalid input.
|
||||||
|
;;
|
||||||
|
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
|
||||||
|
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
|
||||||
|
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
|
||||||
|
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||||
|
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||||
|
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||||
|
-apple)
|
||||||
|
os=
|
||||||
|
basic_machine=$1
|
||||||
|
;;
|
||||||
|
-hiux*)
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
-sco5)
|
||||||
|
os=sco3.2v5
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco4)
|
||||||
|
os=-sco3.2v4
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco3.2.[4-9]*)
|
||||||
|
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco3.2v[4-9]*)
|
||||||
|
# Don't forget version if it is 3.2v4 or newer.
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco*)
|
||||||
|
os=-sco3.2v2
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-isc)
|
||||||
|
os=-isc2.2
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-clix*)
|
||||||
|
basic_machine=clipper-intergraph
|
||||||
|
;;
|
||||||
|
-isc*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-lynx*)
|
||||||
|
os=-lynxos
|
||||||
|
;;
|
||||||
|
-ptx*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
||||||
|
;;
|
||||||
|
-windowsnt*)
|
||||||
|
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
||||||
|
;;
|
||||||
|
-psos*)
|
||||||
|
os=-psos
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Decode aliases for certain CPU-COMPANY combinations.
|
||||||
|
case $basic_machine in
|
||||||
|
# Recognize the basic CPU types without company name.
|
||||||
|
# Some are omitted here because they have special meanings below.
|
||||||
|
tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
|
||||||
|
| arme[lb] | pyramid | mn10200 | mn10300 \
|
||||||
|
| tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
|
||||||
|
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
|
||||||
|
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
|
||||||
|
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
|
||||||
|
| mipstx39 | mipstx39el \
|
||||||
|
| sparc | sparclet | sparclite | sparc64 | v850)
|
||||||
|
basic_machine=$basic_machine-unknown
|
||||||
|
;;
|
||||||
|
# We use `pc' rather than `unknown'
|
||||||
|
# because (1) that's what they normally are, and
|
||||||
|
# (2) the word "unknown" tends to confuse beginning users.
|
||||||
|
i[3456]86)
|
||||||
|
basic_machine=$basic_machine-pc
|
||||||
|
;;
|
||||||
|
# Object if more than one company name word.
|
||||||
|
*-*-*)
|
||||||
|
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
# Recognize the basic CPU types with company name.
|
||||||
|
vax-* | tahoe-* | i[3456]86-* | i860-* | m32r-* | m68k-* | m68000-* \
|
||||||
|
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
|
||||||
|
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
||||||
|
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
|
||||||
|
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
|
||||||
|
| alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
|
||||||
|
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
|
||||||
|
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
||||||
|
| sparc64-* | mips64-* | mipsel-* \
|
||||||
|
| mips64el-* | mips64orion-* | mips64orionel-* \
|
||||||
|
| mipstx39-* | mipstx39el-* \
|
||||||
|
| f301-*)
|
||||||
|
;;
|
||||||
|
# Recognize the various machine names and aliases which stand
|
||||||
|
# for a CPU type and a company and sometimes even an OS.
|
||||||
|
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||||
|
basic_machine=m68000-att
|
||||||
|
;;
|
||||||
|
3b*)
|
||||||
|
basic_machine=we32k-att
|
||||||
|
;;
|
||||||
|
alliant | fx80)
|
||||||
|
basic_machine=fx80-alliant
|
||||||
|
;;
|
||||||
|
altos | altos3068)
|
||||||
|
basic_machine=m68k-altos
|
||||||
|
;;
|
||||||
|
am29k)
|
||||||
|
basic_machine=a29k-none
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
amdahl)
|
||||||
|
basic_machine=580-amdahl
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
amiga | amiga-*)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
;;
|
||||||
|
amigaos | amigados)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
os=-amigaos
|
||||||
|
;;
|
||||||
|
amigaunix | amix)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
apollo68)
|
||||||
|
basic_machine=m68k-apollo
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
aux)
|
||||||
|
basic_machine=m68k-apple
|
||||||
|
os=-aux
|
||||||
|
;;
|
||||||
|
balance)
|
||||||
|
basic_machine=ns32k-sequent
|
||||||
|
os=-dynix
|
||||||
|
;;
|
||||||
|
convex-c1)
|
||||||
|
basic_machine=c1-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c2)
|
||||||
|
basic_machine=c2-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c32)
|
||||||
|
basic_machine=c32-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c34)
|
||||||
|
basic_machine=c34-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c38)
|
||||||
|
basic_machine=c38-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
cray | ymp)
|
||||||
|
basic_machine=ymp-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
cray2)
|
||||||
|
basic_machine=cray2-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
[ctj]90-cray)
|
||||||
|
basic_machine=c90-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
crds | unos)
|
||||||
|
basic_machine=m68k-crds
|
||||||
|
;;
|
||||||
|
da30 | da30-*)
|
||||||
|
basic_machine=m68k-da30
|
||||||
|
;;
|
||||||
|
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
|
||||||
|
basic_machine=mips-dec
|
||||||
|
;;
|
||||||
|
delta | 3300 | motorola-3300 | motorola-delta \
|
||||||
|
| 3300-motorola | delta-motorola)
|
||||||
|
basic_machine=m68k-motorola
|
||||||
|
;;
|
||||||
|
delta88)
|
||||||
|
basic_machine=m88k-motorola
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
dpx20 | dpx20-*)
|
||||||
|
basic_machine=rs6000-bull
|
||||||
|
os=-bosx
|
||||||
|
;;
|
||||||
|
dpx2* | dpx2*-bull)
|
||||||
|
basic_machine=m68k-bull
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
ebmon29k)
|
||||||
|
basic_machine=a29k-amd
|
||||||
|
os=-ebmon
|
||||||
|
;;
|
||||||
|
elxsi)
|
||||||
|
basic_machine=elxsi-elxsi
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
encore | umax | mmax)
|
||||||
|
basic_machine=ns32k-encore
|
||||||
|
;;
|
||||||
|
fx2800)
|
||||||
|
basic_machine=i860-alliant
|
||||||
|
;;
|
||||||
|
genix)
|
||||||
|
basic_machine=ns32k-ns
|
||||||
|
;;
|
||||||
|
gmicro)
|
||||||
|
basic_machine=tron-gmicro
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
h3050r* | hiux*)
|
||||||
|
basic_machine=hppa1.1-hitachi
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
h8300hms)
|
||||||
|
basic_machine=h8300-hitachi
|
||||||
|
os=-hms
|
||||||
|
;;
|
||||||
|
harris)
|
||||||
|
basic_machine=m88k-harris
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
hp300-*)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
;;
|
||||||
|
hp300bsd)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
hp300hpux)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
os=-hpux
|
||||||
|
;;
|
||||||
|
hp9k2[0-9][0-9] | hp9k31[0-9])
|
||||||
|
basic_machine=m68000-hp
|
||||||
|
;;
|
||||||
|
hp9k3[2-9][0-9])
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
;;
|
||||||
|
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
|
||||||
|
basic_machine=hppa1.1-hp
|
||||||
|
;;
|
||||||
|
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
||||||
|
basic_machine=hppa1.0-hp
|
||||||
|
;;
|
||||||
|
hppa-next)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
i370-ibm* | ibm*)
|
||||||
|
basic_machine=i370-ibm
|
||||||
|
os=-mvs
|
||||||
|
;;
|
||||||
|
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||||
|
i[3456]86v32)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv32
|
||||||
|
;;
|
||||||
|
i[3456]86v4*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
i[3456]86v)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
i[3456]86sol2)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
iris | iris4d)
|
||||||
|
basic_machine=mips-sgi
|
||||||
|
case $os in
|
||||||
|
-irix*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-irix4
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
isi68 | isi)
|
||||||
|
basic_machine=m68k-isi
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
m88k-omron*)
|
||||||
|
basic_machine=m88k-omron
|
||||||
|
;;
|
||||||
|
magnum | m3230)
|
||||||
|
basic_machine=mips-mips
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
merlin)
|
||||||
|
basic_machine=ns32k-utek
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
miniframe)
|
||||||
|
basic_machine=m68000-convergent
|
||||||
|
;;
|
||||||
|
mipsel*-linux*)
|
||||||
|
basic_machine=mipsel-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
mips*-linux*)
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
mips3*-*)
|
||||||
|
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
||||||
|
;;
|
||||||
|
mips3*)
|
||||||
|
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||||
|
;;
|
||||||
|
ncr3000)
|
||||||
|
basic_machine=i486-ncr
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
news | news700 | news800 | news900)
|
||||||
|
basic_machine=m68k-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
news1000)
|
||||||
|
basic_machine=m68030-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
news-3600 | risc-news)
|
||||||
|
basic_machine=mips-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
next | m*-next )
|
||||||
|
basic_machine=m68k-next
|
||||||
|
case $os in
|
||||||
|
-nextstep* )
|
||||||
|
;;
|
||||||
|
-ns2*)
|
||||||
|
os=-nextstep2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
nh3000)
|
||||||
|
basic_machine=m68k-harris
|
||||||
|
os=-cxux
|
||||||
|
;;
|
||||||
|
nh[45]000)
|
||||||
|
basic_machine=m88k-harris
|
||||||
|
os=-cxux
|
||||||
|
;;
|
||||||
|
nindy960)
|
||||||
|
basic_machine=i960-intel
|
||||||
|
os=-nindy
|
||||||
|
;;
|
||||||
|
np1)
|
||||||
|
basic_machine=np1-gould
|
||||||
|
;;
|
||||||
|
pa-hitachi)
|
||||||
|
basic_machine=hppa1.1-hitachi
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
paragon)
|
||||||
|
basic_machine=i860-intel
|
||||||
|
os=-osf
|
||||||
|
;;
|
||||||
|
pbd)
|
||||||
|
basic_machine=sparc-tti
|
||||||
|
;;
|
||||||
|
pbb)
|
||||||
|
basic_machine=m68k-tti
|
||||||
|
;;
|
||||||
|
pc532 | pc532-*)
|
||||||
|
basic_machine=ns32k-pc532
|
||||||
|
;;
|
||||||
|
pentium | p5)
|
||||||
|
basic_machine=i586-intel
|
||||||
|
;;
|
||||||
|
pentiumpro | p6)
|
||||||
|
basic_machine=i686-intel
|
||||||
|
;;
|
||||||
|
pentium-* | p5-*)
|
||||||
|
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
pentiumpro-* | p6-*)
|
||||||
|
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
k5)
|
||||||
|
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
|
||||||
|
basic_machine=i586-amd
|
||||||
|
;;
|
||||||
|
nexen)
|
||||||
|
# We don't have specific support for Nexgen yet, so just call it a Pentium
|
||||||
|
basic_machine=i586-nexgen
|
||||||
|
;;
|
||||||
|
pn)
|
||||||
|
basic_machine=pn-gould
|
||||||
|
;;
|
||||||
|
power) basic_machine=rs6000-ibm
|
||||||
|
;;
|
||||||
|
ppc) basic_machine=powerpc-unknown
|
||||||
|
;;
|
||||||
|
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||||
|
basic_machine=powerpcle-unknown
|
||||||
|
;;
|
||||||
|
ppcle-* | powerpclittle-*)
|
||||||
|
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
ps2)
|
||||||
|
basic_machine=i386-ibm
|
||||||
|
;;
|
||||||
|
rm[46]00)
|
||||||
|
basic_machine=mips-siemens
|
||||||
|
;;
|
||||||
|
rtpc | rtpc-*)
|
||||||
|
basic_machine=romp-ibm
|
||||||
|
;;
|
||||||
|
sequent)
|
||||||
|
basic_machine=i386-sequent
|
||||||
|
;;
|
||||||
|
sh)
|
||||||
|
basic_machine=sh-hitachi
|
||||||
|
os=-hms
|
||||||
|
;;
|
||||||
|
sps7)
|
||||||
|
basic_machine=m68k-bull
|
||||||
|
os=-sysv2
|
||||||
|
;;
|
||||||
|
spur)
|
||||||
|
basic_machine=spur-unknown
|
||||||
|
;;
|
||||||
|
sun2)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
;;
|
||||||
|
sun2os3)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun2os4)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun3os3)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun3os4)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun4os3)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun4os4)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun4sol2)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
sun3 | sun3-*)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
;;
|
||||||
|
sun4)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
;;
|
||||||
|
sun386 | sun386i | roadrunner)
|
||||||
|
basic_machine=i386-sun
|
||||||
|
;;
|
||||||
|
symmetry)
|
||||||
|
basic_machine=i386-sequent
|
||||||
|
os=-dynix
|
||||||
|
;;
|
||||||
|
tx39)
|
||||||
|
basic_machine=mipstx39-unknown
|
||||||
|
;;
|
||||||
|
tx39el)
|
||||||
|
basic_machine=mipstx39el-unknown
|
||||||
|
;;
|
||||||
|
tower | tower-32)
|
||||||
|
basic_machine=m68k-ncr
|
||||||
|
;;
|
||||||
|
udi29k)
|
||||||
|
basic_machine=a29k-amd
|
||||||
|
os=-udi
|
||||||
|
;;
|
||||||
|
ultra3)
|
||||||
|
basic_machine=a29k-nyu
|
||||||
|
os=-sym1
|
||||||
|
;;
|
||||||
|
vaxv)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
vms)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
os=-vms
|
||||||
|
;;
|
||||||
|
vpp*|vx|vx-*)
|
||||||
|
basic_machine=f301-fujitsu
|
||||||
|
;;
|
||||||
|
vxworks960)
|
||||||
|
basic_machine=i960-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
vxworks68)
|
||||||
|
basic_machine=m68k-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
vxworks29k)
|
||||||
|
basic_machine=a29k-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
xmp)
|
||||||
|
basic_machine=xmp-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
xps | xps100)
|
||||||
|
basic_machine=xps100-honeywell
|
||||||
|
;;
|
||||||
|
none)
|
||||||
|
basic_machine=none-none
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
|
||||||
|
# Here we handle the default manufacturer of certain CPU types. It is in
|
||||||
|
# some cases the only manufacturer, in others, it is the most popular.
|
||||||
|
mips)
|
||||||
|
if [ x$os = x-linux-gnu ]; then
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
else
|
||||||
|
basic_machine=mips-mips
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
romp)
|
||||||
|
basic_machine=romp-ibm
|
||||||
|
;;
|
||||||
|
rs6000)
|
||||||
|
basic_machine=rs6000-ibm
|
||||||
|
;;
|
||||||
|
vax)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
;;
|
||||||
|
pdp11)
|
||||||
|
basic_machine=pdp11-dec
|
||||||
|
;;
|
||||||
|
we32k)
|
||||||
|
basic_machine=we32k-att
|
||||||
|
;;
|
||||||
|
sparc)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
;;
|
||||||
|
cydra)
|
||||||
|
basic_machine=cydra-cydrome
|
||||||
|
;;
|
||||||
|
orion)
|
||||||
|
basic_machine=orion-highlevel
|
||||||
|
;;
|
||||||
|
orion105)
|
||||||
|
basic_machine=clipper-highlevel
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Here we canonicalize certain aliases for manufacturers.
|
||||||
|
case $basic_machine in
|
||||||
|
*-digital*)
|
||||||
|
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
||||||
|
;;
|
||||||
|
*-commodore*)
|
||||||
|
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Decode manufacturer-specific aliases for certain operating systems.
|
||||||
|
|
||||||
|
if [ x"$os" != x"" ]
|
||||||
|
then
|
||||||
|
case $os in
|
||||||
|
# First match some system type aliases
|
||||||
|
# that might get confused with valid system types.
|
||||||
|
# -solaris* is a basic system type, with this one exception.
|
||||||
|
-solaris1 | -solaris1.*)
|
||||||
|
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||||
|
;;
|
||||||
|
-solaris)
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
-svr4*)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-unixware*)
|
||||||
|
os=-sysv4.2uw
|
||||||
|
;;
|
||||||
|
-gnu/linux*)
|
||||||
|
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
|
||||||
|
;;
|
||||||
|
# First accept the basic system types.
|
||||||
|
# The portable systems comes first.
|
||||||
|
# Each alternative MUST END IN A *, to match a version number.
|
||||||
|
# -sysv* is not here because it comes later, after sysvr4.
|
||||||
|
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||||
|
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||||
|
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||||
|
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||||
|
| -aos* \
|
||||||
|
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||||
|
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||||
|
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
|
||||||
|
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
|
||||||
|
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||||
|
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||||
|
| -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
|
| -mingw32* | -linux-gnu* | -uxpv*)
|
||||||
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
|
;;
|
||||||
|
-linux*)
|
||||||
|
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
||||||
|
;;
|
||||||
|
-sunos5*)
|
||||||
|
os=`echo $os | sed -e 's|sunos5|solaris2|'`
|
||||||
|
;;
|
||||||
|
-sunos6*)
|
||||||
|
os=`echo $os | sed -e 's|sunos6|solaris3|'`
|
||||||
|
;;
|
||||||
|
-osfrose*)
|
||||||
|
os=-osfrose
|
||||||
|
;;
|
||||||
|
-osf*)
|
||||||
|
os=-osf
|
||||||
|
;;
|
||||||
|
-utek*)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
-dynix*)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
-acis*)
|
||||||
|
os=-aos
|
||||||
|
;;
|
||||||
|
-ctix* | -uts*)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
-ns2 )
|
||||||
|
os=-nextstep2
|
||||||
|
;;
|
||||||
|
# Preserve the version number of sinix5.
|
||||||
|
-sinix5.*)
|
||||||
|
os=`echo $os | sed -e 's|sinix|sysv|'`
|
||||||
|
;;
|
||||||
|
-sinix*)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-triton*)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-oss*)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-svr4)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-svr3)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-sysvr4)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
# This must come after -sysvr4.
|
||||||
|
-sysv*)
|
||||||
|
;;
|
||||||
|
-xenix)
|
||||||
|
os=-xenix
|
||||||
|
;;
|
||||||
|
-none)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Get rid of the `-' at the beginning of $os.
|
||||||
|
os=`echo $os | sed 's/[^-]*-//'`
|
||||||
|
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
|
||||||
|
# Here we handle the default operating systems that come with various machines.
|
||||||
|
# The value should be what the vendor currently ships out the door with their
|
||||||
|
# machine or put another way, the most popular os provided with the machine.
|
||||||
|
|
||||||
|
# Note that if you're going to try to match "-MANUFACTURER" here (say,
|
||||||
|
# "-sun"), then you have to tell the case statement up towards the top
|
||||||
|
# that MANUFACTURER isn't an operating system. Otherwise, code above
|
||||||
|
# will signal an error saying that MANUFACTURER isn't an operating
|
||||||
|
# system, and we'll never get to this point.
|
||||||
|
|
||||||
|
case $basic_machine in
|
||||||
|
*-acorn)
|
||||||
|
os=-riscix1.2
|
||||||
|
;;
|
||||||
|
arm*-semi)
|
||||||
|
os=-aout
|
||||||
|
;;
|
||||||
|
pdp11-*)
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
*-dec | vax-*)
|
||||||
|
os=-ultrix4.2
|
||||||
|
;;
|
||||||
|
m68*-apollo)
|
||||||
|
os=-domain
|
||||||
|
;;
|
||||||
|
i386-sun)
|
||||||
|
os=-sunos4.0.2
|
||||||
|
;;
|
||||||
|
m68000-sun)
|
||||||
|
os=-sunos3
|
||||||
|
# This also exists in the configure program, but was not the
|
||||||
|
# default.
|
||||||
|
# os=-sunos4
|
||||||
|
;;
|
||||||
|
*-tti) # must be before sparc entry or we get the wrong os.
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
sparc-* | *-sun)
|
||||||
|
os=-sunos4.1.1
|
||||||
|
;;
|
||||||
|
*-ibm)
|
||||||
|
os=-aix
|
||||||
|
;;
|
||||||
|
*-hp)
|
||||||
|
os=-hpux
|
||||||
|
;;
|
||||||
|
*-hitachi)
|
||||||
|
os=-hiux
|
||||||
|
;;
|
||||||
|
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
*-cbm)
|
||||||
|
os=-amigaos
|
||||||
|
;;
|
||||||
|
*-dg)
|
||||||
|
os=-dgux
|
||||||
|
;;
|
||||||
|
*-dolphin)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
m68k-ccur)
|
||||||
|
os=-rtu
|
||||||
|
;;
|
||||||
|
m88k-omron*)
|
||||||
|
os=-luna
|
||||||
|
;;
|
||||||
|
*-next )
|
||||||
|
os=-nextstep
|
||||||
|
;;
|
||||||
|
*-sequent)
|
||||||
|
os=-ptx
|
||||||
|
;;
|
||||||
|
*-crds)
|
||||||
|
os=-unos
|
||||||
|
;;
|
||||||
|
*-ns)
|
||||||
|
os=-genix
|
||||||
|
;;
|
||||||
|
i370-*)
|
||||||
|
os=-mvs
|
||||||
|
;;
|
||||||
|
*-next)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
*-gould)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
*-highlevel)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
*-encore)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
*-sgi)
|
||||||
|
os=-irix
|
||||||
|
;;
|
||||||
|
*-siemens)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
*-masscomp)
|
||||||
|
os=-rtu
|
||||||
|
;;
|
||||||
|
f301-fujitsu)
|
||||||
|
os=-uxpv
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Here we handle the case where we know the os, and the CPU type, but not the
|
||||||
|
# manufacturer. We pick the logical manufacturer.
|
||||||
|
vendor=unknown
|
||||||
|
case $basic_machine in
|
||||||
|
*-unknown)
|
||||||
|
case $os in
|
||||||
|
-riscix*)
|
||||||
|
vendor=acorn
|
||||||
|
;;
|
||||||
|
-sunos*)
|
||||||
|
vendor=sun
|
||||||
|
;;
|
||||||
|
-aix*)
|
||||||
|
vendor=ibm
|
||||||
|
;;
|
||||||
|
-hpux*)
|
||||||
|
vendor=hp
|
||||||
|
;;
|
||||||
|
-hiux*)
|
||||||
|
vendor=hitachi
|
||||||
|
;;
|
||||||
|
-unos*)
|
||||||
|
vendor=crds
|
||||||
|
;;
|
||||||
|
-dgux*)
|
||||||
|
vendor=dg
|
||||||
|
;;
|
||||||
|
-luna*)
|
||||||
|
vendor=omron
|
||||||
|
;;
|
||||||
|
-genix*)
|
||||||
|
vendor=ns
|
||||||
|
;;
|
||||||
|
-mvs*)
|
||||||
|
vendor=ibm
|
||||||
|
;;
|
||||||
|
-ptx*)
|
||||||
|
vendor=sequent
|
||||||
|
;;
|
||||||
|
-vxsim* | -vxworks*)
|
||||||
|
vendor=wrs
|
||||||
|
;;
|
||||||
|
-aux*)
|
||||||
|
vendor=apple
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo $basic_machine$os
|
||||||
2480
libffi/configure
vendored
Executable file
2480
libffi/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
69
libffi/configure.in
Normal file
69
libffi/configure.in
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
dnl Process this with autoconf to create configure
|
||||||
|
AC_INIT(fficonfig.h.in)
|
||||||
|
AM_CONFIG_HEADER(fficonfig.h)
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE(libffi,1.20)
|
||||||
|
|
||||||
|
AC_PROG_CC
|
||||||
|
AM_PROG_LIBTOOL
|
||||||
|
|
||||||
|
TARGETDIR="unknown"
|
||||||
|
case "$host" in
|
||||||
|
mips-sgi-irix5.* | mips-sgi-irix6.*) TARGET=MIPS; TARGETDIR=mips;;
|
||||||
|
i*86-pc-linux*) TARGET=X86; TARGETDIR=x86;;
|
||||||
|
sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
|
||||||
|
sparc-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
|
||||||
|
alpha*-*-linux* | alpha*-*-osf*) TARGET=ALPHA; TARGETDIR=alpha;;
|
||||||
|
m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
|
||||||
|
powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
|
||||||
|
arm-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test $TARGETDIR = unknown; then
|
||||||
|
AC_ERROR("libffi has not been ported to $host.")
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
|
||||||
|
AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
|
||||||
|
AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
|
||||||
|
AM_CONDITIONAL(X86, test x$TARGET = xX86)
|
||||||
|
AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA)
|
||||||
|
AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
|
||||||
|
AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
|
||||||
|
AM_CONDITIONAL(ARM, test x$TARGET = xARM)
|
||||||
|
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_FUNCS(memcpy)
|
||||||
|
AC_FUNC_ALLOCA
|
||||||
|
|
||||||
|
dnl AC_CHECK_SIZEOF(char)
|
||||||
|
AC_CHECK_SIZEOF(short)
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(long long)
|
||||||
|
AC_CHECK_SIZEOF(float)
|
||||||
|
AC_CHECK_SIZEOF(double)
|
||||||
|
AC_CHECK_SIZEOF(long double)
|
||||||
|
|
||||||
|
AC_SUBST(TARGET)
|
||||||
|
AC_SUBST(TARGETDIR)
|
||||||
|
|
||||||
|
AC_SUBST(SHELL)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(debug,[ --enable-debug Debugging mode], AC_DEFINE(FFI_DEBUG))
|
||||||
|
AC_ARG_ENABLE(purify-safety,
|
||||||
|
[ --enable-purify-safety Purify-safe mode], AC_DEFINE(USING_PURIFY))
|
||||||
|
|
||||||
|
AC_OUTPUT(include/Makefile include/ffi.h Makefile src/Makefile,,
|
||||||
|
test ! -d include && mkdir include
|
||||||
|
test ! -f include/fficonfig.h && cp fficonfig.h include/fficonfig.h
|
||||||
|
if cmp -s fficonfig.h include/fficonfig.h 2>/dev/null; then
|
||||||
|
echo fficonfig.h unchanged
|
||||||
|
else
|
||||||
|
echo Moving fficonfig.h to include/fficonfig.h
|
||||||
|
cp fficonfig.h include/fficonfig.h
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
63
libffi/fficonfig.h.in
Normal file
63
libffi/fficonfig.h.in
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/* fficonfig.h.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
/* Define if using alloca.c. */
|
||||||
|
#undef C_ALLOCA
|
||||||
|
|
||||||
|
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
|
||||||
|
This function is required for alloca.c support on those systems. */
|
||||||
|
#undef CRAY_STACKSEG_END
|
||||||
|
|
||||||
|
/* Define if you have alloca, as a function or macro. */
|
||||||
|
#undef HAVE_ALLOCA
|
||||||
|
|
||||||
|
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
|
||||||
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
|
/* If using the C implementation of alloca, define if you know the
|
||||||
|
direction of stack growth for your system; otherwise it will be
|
||||||
|
automatically deduced at run-time.
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown
|
||||||
|
*/
|
||||||
|
#undef STACK_DIRECTION
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define this if you want extra debugging */
|
||||||
|
#undef FFI_DEBUG
|
||||||
|
|
||||||
|
/* Define this if you are using Purify and want to suppress
|
||||||
|
spurious messages. */
|
||||||
|
#undef USING_PURIFY
|
||||||
|
|
||||||
|
/* This is the package name */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* This is the package version */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* The number of bytes in a double. */
|
||||||
|
#undef SIZEOF_DOUBLE
|
||||||
|
|
||||||
|
/* The number of bytes in a float. */
|
||||||
|
#undef SIZEOF_FLOAT
|
||||||
|
|
||||||
|
/* The number of bytes in a int. */
|
||||||
|
#undef SIZEOF_INT
|
||||||
|
|
||||||
|
/* The number of bytes in a long. */
|
||||||
|
#undef SIZEOF_LONG
|
||||||
|
|
||||||
|
/* The number of bytes in a long double. */
|
||||||
|
#undef SIZEOF_LONG_DOUBLE
|
||||||
|
|
||||||
|
/* The number of bytes in a long long. */
|
||||||
|
#undef SIZEOF_LONG_LONG
|
||||||
|
|
||||||
|
/* The number of bytes in a short. */
|
||||||
|
#undef SIZEOF_SHORT
|
||||||
|
|
||||||
|
/* Define if you have the memcpy function. */
|
||||||
|
#undef HAVE_MEMCPY
|
||||||
9
libffi/include/Makefile.am
Normal file
9
libffi/include/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
## Process this with automake to create Makefile.in
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
EXTRA_DIST = ffi.h.in ffi_common.h ffi_mips.h
|
||||||
|
|
||||||
|
hackdir=$(includedir)
|
||||||
|
|
||||||
|
hack_DATA=fficonfig.h ffi.h ffi_mips.h
|
||||||
194
libffi/include/Makefile.in
Normal file
194
libffi/include/Makefile.in
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.2 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = true
|
||||||
|
PRE_INSTALL = true
|
||||||
|
POST_INSTALL = true
|
||||||
|
NORMAL_UNINSTALL = true
|
||||||
|
PRE_UNINSTALL = true
|
||||||
|
POST_UNINSTALL = true
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CC = @CC@
|
||||||
|
LD = @LD@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
TARGET = @TARGET@
|
||||||
|
TARGETDIR = @TARGETDIR@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
EXTRA_DIST = ffi.h.in ffi_common.h ffi_mips.h
|
||||||
|
|
||||||
|
hackdir=$(includedir)
|
||||||
|
|
||||||
|
hack_DATA=fficonfig.h ffi.h ffi_mips.h
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../fficonfig.h
|
||||||
|
CONFIG_CLEAN_FILES = ffi.h
|
||||||
|
DATA = $(hack_DATA)
|
||||||
|
|
||||||
|
DIST_COMMON = ChangeLog Makefile.am Makefile.in ffi.h.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
default: all
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
ffi.h: $(top_builddir)/config.status ffi.h.in
|
||||||
|
cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
|
||||||
|
|
||||||
|
install-hackDATA: $(hack_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
$(mkinstalldirs) $(hackdir)
|
||||||
|
@list='$(hack_DATA)'; for p in $$list; do \
|
||||||
|
if test -f $(srcdir)/$$p; then \
|
||||||
|
echo " $(INSTALL_DATA) $(srcdir)/$$p $(hackdir)/$$p"; \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/$$p $(hackdir)/$$p; \
|
||||||
|
else if test -f $$p; then \
|
||||||
|
echo " $(INSTALL_DATA) $$p $(hackdir)/$$p"; \
|
||||||
|
$(INSTALL_DATA) $$p $(hackdir)/$$p; \
|
||||||
|
fi; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-hackDATA:
|
||||||
|
$(NORMAL_UNINSTALL)
|
||||||
|
list='$(hack_DATA)'; for p in $$list; do \
|
||||||
|
rm -f $(hackdir)/$$p; \
|
||||||
|
done
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = include
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
here=`cd $(top_builddir) && pwd`; \
|
||||||
|
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||||
|
cd $(top_srcdir) \
|
||||||
|
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign include/Makefile
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data: install-hackDATA
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall: uninstall-hackDATA
|
||||||
|
|
||||||
|
all: Makefile $(DATA)
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
$(mkinstalldirs) $(hackdir)
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-generic clean
|
||||||
|
rm -f config.status
|
||||||
|
rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-generic distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: default uninstall-hackDATA install-hackDATA tags distdir info \
|
||||||
|
dvi installcheck install-exec install-data install uninstall all \
|
||||||
|
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||||
|
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
291
libffi/include/ffi.h.in
Normal file
291
libffi/include/ffi.h.in
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
/* -----------------------------------------------------------------*-C-*-
|
||||||
|
libffi @VERSION@ - Copyright (c) 1996, 1997, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
$Id: ffi.h.in,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef LIBFFI_H
|
||||||
|
#define LIBFFI_H
|
||||||
|
|
||||||
|
/* Specify which architecture libffi is configured for. */
|
||||||
|
#define @TARGET@
|
||||||
|
|
||||||
|
/* ---- System configuration information --------------------------------- */
|
||||||
|
|
||||||
|
#include <fficonfig.h>
|
||||||
|
|
||||||
|
#if !defined(LIBFFI_ASM)
|
||||||
|
#include <stddef.h>
|
||||||
|
#if defined(FFI_DEBUG)
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- Generic type definitions ----------------------------------------- */
|
||||||
|
|
||||||
|
#define FLOAT32 float
|
||||||
|
#define FLOAT64 double
|
||||||
|
#define FLOAT80 long double
|
||||||
|
|
||||||
|
#define UINT8 unsigned char
|
||||||
|
#define SINT8 signed char
|
||||||
|
|
||||||
|
#if SIZEOF_INT == 2
|
||||||
|
|
||||||
|
#define UINT16 unsigned int
|
||||||
|
#define SINT16 int
|
||||||
|
#define ffi_type_uint ffi_type_uint16
|
||||||
|
#define ffi_type_sint ffi_type_sint16
|
||||||
|
|
||||||
|
#else
|
||||||
|
#if SIZEOF_SHORT == 2
|
||||||
|
|
||||||
|
#define UINT16 unsigned short
|
||||||
|
#define SINT16 short
|
||||||
|
#define ffi_type_ushort ffi_type_uint16
|
||||||
|
#define ffi_type_sshort ffi_type_sint16
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SIZEOF_INT == 4
|
||||||
|
|
||||||
|
#define UINT32 unsigned int
|
||||||
|
#define SINT32 int
|
||||||
|
#define ffi_type_uint ffi_type_uint32
|
||||||
|
#define ffi_type_sint ffi_type_sint32
|
||||||
|
|
||||||
|
#else
|
||||||
|
#if SIZEOF_SHORT == 4
|
||||||
|
|
||||||
|
#define UINT32 unsigned short
|
||||||
|
#define SINT32 short
|
||||||
|
#define ffi_type_ushort ffi_type_uint32
|
||||||
|
#define ffi_type_sshort ffi_type_sint32
|
||||||
|
|
||||||
|
#else
|
||||||
|
#if SIZEOF_LONG == 4
|
||||||
|
|
||||||
|
#define UINT32 unsigned long
|
||||||
|
#define SINT32 long
|
||||||
|
#define ffi_type_ulong ffi_type_uint32
|
||||||
|
#define ffi_type_slong ffi_type_sint32
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SIZEOF_INT == 8
|
||||||
|
|
||||||
|
#define UINT64 unsigned int
|
||||||
|
#define SINT64 int
|
||||||
|
#define ffi_type_uint ffi_type_uint64
|
||||||
|
#define ffi_type_sint ffi_type_sint64
|
||||||
|
|
||||||
|
#else
|
||||||
|
#if SIZEOF_LONG == 8
|
||||||
|
|
||||||
|
#define UINT64 unsigned long
|
||||||
|
#define SINT64 long
|
||||||
|
#define ffi_type_ulong ffi_type_uint64
|
||||||
|
#define ffi_type_slong ffi_type_sint64
|
||||||
|
|
||||||
|
#else
|
||||||
|
#if SIZEOF_LONG_LONG == 8
|
||||||
|
|
||||||
|
#define UINT64 unsigned long long
|
||||||
|
#define SINT64 long long
|
||||||
|
#define ffi_type_ulong ffi_type_uint64
|
||||||
|
#define ffi_type_slong ffi_type_sint64
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- System specific configurations ----------------------------------- */
|
||||||
|
|
||||||
|
#ifdef MIPS
|
||||||
|
#include <ffi_mips.h>
|
||||||
|
#else
|
||||||
|
#define SIZEOF_ARG sizeof(void*)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LIBFFI_ASM
|
||||||
|
|
||||||
|
/* ---- Generic type definitions ----------------------------------------- */
|
||||||
|
|
||||||
|
#define ALIGN(v, a) (((((unsigned) (v))-1) | ((a)-1))+1)
|
||||||
|
|
||||||
|
typedef enum ffi_abi {
|
||||||
|
|
||||||
|
/* Leave this for debugging purposes */
|
||||||
|
FFI_FIRST_ABI = 0,
|
||||||
|
|
||||||
|
/* ---- Sparc -------------------- */
|
||||||
|
#ifdef SPARC
|
||||||
|
FFI_V8,
|
||||||
|
FFI_DEFAULT_ABI = FFI_V8,
|
||||||
|
FFI_V8PLUS,
|
||||||
|
FFI_V9,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- Intel x86 ---------------- */
|
||||||
|
#ifdef X86
|
||||||
|
FFI_SYSV,
|
||||||
|
FFI_DEFAULT_ABI = FFI_SYSV,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- Mips --------------------- */
|
||||||
|
#ifdef MIPS
|
||||||
|
FFI_O32,
|
||||||
|
FFI_N32,
|
||||||
|
FFI_N64,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- Alpha -------------------- */
|
||||||
|
#ifdef ALPHA
|
||||||
|
FFI_OSF,
|
||||||
|
FFI_DEFAULT_ABI = FFI_OSF,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- Motorola m68k ------------ */
|
||||||
|
#ifdef M68K
|
||||||
|
FFI_SYSV,
|
||||||
|
FFI_DEFAULT_ABI = FFI_SYSV,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- PowerPC ------------------ */
|
||||||
|
#ifdef POWERPC
|
||||||
|
FFI_SYSV,
|
||||||
|
FFI_GCC_SYSV,
|
||||||
|
FFI_DEFAULT_ABI = FFI_GCC_SYSV,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---- ARM --------------------- */
|
||||||
|
#ifdef ARM
|
||||||
|
FFI_SYSV,
|
||||||
|
FFI_DEFAULT_ABI = FFI_SYSV,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Leave this for debugging purposes */
|
||||||
|
FFI_LAST_ABI
|
||||||
|
|
||||||
|
} ffi_abi;
|
||||||
|
|
||||||
|
typedef struct _ffi_type
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
unsigned short alignment;
|
||||||
|
unsigned short type;
|
||||||
|
/*@null@*/ struct _ffi_type **elements;
|
||||||
|
} ffi_type;
|
||||||
|
|
||||||
|
/* These are defined in ffi.c */
|
||||||
|
extern ffi_type ffi_type_void;
|
||||||
|
extern ffi_type ffi_type_uint8;
|
||||||
|
extern ffi_type ffi_type_sint8;
|
||||||
|
extern ffi_type ffi_type_uint16;
|
||||||
|
extern ffi_type ffi_type_sint16;
|
||||||
|
extern ffi_type ffi_type_uint32;
|
||||||
|
extern ffi_type ffi_type_sint32;
|
||||||
|
extern ffi_type ffi_type_uint64;
|
||||||
|
extern ffi_type ffi_type_sint64;
|
||||||
|
extern ffi_type ffi_type_float;
|
||||||
|
extern ffi_type ffi_type_double;
|
||||||
|
extern ffi_type ffi_type_longdouble;
|
||||||
|
extern ffi_type ffi_type_pointer;
|
||||||
|
|
||||||
|
/* Characters are 8 bit integral types */
|
||||||
|
#define ffi_type_schar ffi_type_sint8
|
||||||
|
#define ffi_type_uchar ffi_type_uint8
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FFI_OK = 0,
|
||||||
|
FFI_BAD_TYPEDEF,
|
||||||
|
FFI_BAD_ABI
|
||||||
|
} ffi_status;
|
||||||
|
|
||||||
|
typedef unsigned FFI_TYPE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ffi_abi abi;
|
||||||
|
unsigned nargs;
|
||||||
|
/*@dependent@*/ ffi_type **arg_types;
|
||||||
|
/*@dependent@*/ ffi_type *rtype;
|
||||||
|
unsigned bytes;
|
||||||
|
unsigned flags;
|
||||||
|
|
||||||
|
#ifdef MIPS
|
||||||
|
#if _MIPS_SIM == _ABIN32
|
||||||
|
unsigned rstruct_flag;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} ffi_cif;
|
||||||
|
|
||||||
|
/* ---- Public interface definition -------------------------------------- */
|
||||||
|
|
||||||
|
ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
|
||||||
|
ffi_abi abi,
|
||||||
|
unsigned int nargs,
|
||||||
|
/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype,
|
||||||
|
/*@dependent@*/ ffi_type **atypes);
|
||||||
|
|
||||||
|
void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
||||||
|
void (*fn)(),
|
||||||
|
/*@out@*/ void *rvalue,
|
||||||
|
/*@dependent@*/ void **avalue);
|
||||||
|
|
||||||
|
/* Useful for eliminating compiler warnings */
|
||||||
|
#define FFI_FN(f) ((void (*)())f)
|
||||||
|
|
||||||
|
/* ---- Definitions shared with assembly code ---------------------------- */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FFI_TYPE_VOID 0
|
||||||
|
#define FFI_TYPE_INT 1
|
||||||
|
#define FFI_TYPE_FLOAT 2
|
||||||
|
#define FFI_TYPE_DOUBLE 3
|
||||||
|
#if SIZEOF_LONG_DOUBLE == SIZEOF_DOUBLE
|
||||||
|
#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
|
||||||
|
#else
|
||||||
|
#define FFI_TYPE_LONGDOUBLE 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FFI_TYPE_UINT8 5 /* If this changes, update ffi_mips.h. */
|
||||||
|
#define FFI_TYPE_SINT8 6 /* If this changes, update ffi_mips.h. */
|
||||||
|
#define FFI_TYPE_UINT16 7
|
||||||
|
#define FFI_TYPE_SINT16 8
|
||||||
|
#define FFI_TYPE_UINT32 9
|
||||||
|
#define FFI_TYPE_SINT32 10
|
||||||
|
#define FFI_TYPE_UINT64 11
|
||||||
|
#define FFI_TYPE_SINT64 12
|
||||||
|
#define FFI_TYPE_STRUCT 13 /* If this changes, update ffi_mips.h. */
|
||||||
|
#define FFI_TYPE_POINTER 14
|
||||||
|
|
||||||
|
/* This should always refer to the last type code (for sanity checks) */
|
||||||
|
#define FFI_TYPE_LAST FFI_TYPE_POINTER
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
80
libffi/include/ffi_common.h
Normal file
80
libffi/include/ffi_common.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi_common.h - Copyright (c) 1996 Cygnus Solutions
|
||||||
|
|
||||||
|
$Id: ffi_common.h,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Common internal definitions and macros. Only necessary for building
|
||||||
|
libffi.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef FFI_COMMON_H
|
||||||
|
#define FFI_COMMON_H
|
||||||
|
|
||||||
|
/* Do not move this. Some versions of AIX are very picky about where
|
||||||
|
this is positioned. */
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
#else
|
||||||
|
# if HAVE_ALLOCA_H
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca /* predefined by HP cc +Olibcalls */
|
||||||
|
char *alloca ();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check for the existence of memcpy. */
|
||||||
|
#if STDC_HEADERS
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# ifndef HAVE_MEMCPY
|
||||||
|
# define memcpy(d, s, n) bcopy ((s), (d), (n))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE (!FALSE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* bool is a keyword in C++ */
|
||||||
|
/*@-cppnames@*/
|
||||||
|
typedef int bool;
|
||||||
|
/*@=cppnames@*/
|
||||||
|
|
||||||
|
#ifdef FFI_DEBUG
|
||||||
|
|
||||||
|
/* Debugging functions */
|
||||||
|
/*@exits@*/ int ffi_assert(/*@temp@*/ char *file, int line);
|
||||||
|
void ffi_stop_here(void);
|
||||||
|
bool ffi_type_test(/*@temp@*/ /*@out@*/ ffi_type *a);
|
||||||
|
|
||||||
|
#define FFI_ASSERT(x) ((x) ? 0 : ffi_assert(__FILE__,__LINE__))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define FFI_ASSERT(x)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif);
|
||||||
|
|
||||||
|
/* Extended cif, used in callback from assembly routine */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/*@dependent@*/ ffi_cif *cif;
|
||||||
|
/*@dependent@*/ void *rvalue;
|
||||||
|
/*@dependent@*/ void **avalue;
|
||||||
|
} extended_cif;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
143
libffi/include/ffi_mips.h
Normal file
143
libffi/include/ffi_mips.h
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi-mips.h - Copyright (c) 1996 Cygnus Support
|
||||||
|
|
||||||
|
MIPS FFI Definitions
|
||||||
|
|
||||||
|
$Id: ffi_mips.h,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SUPPORT BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef FFI_MIPS_H
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
#if !defined(_MIPS_SIM)
|
||||||
|
-- something is very wrong --
|
||||||
|
#else
|
||||||
|
# if _MIPS_SIM==_ABIN32 && defined(_ABIN32)
|
||||||
|
# define FFI_MIPS_N32
|
||||||
|
# else
|
||||||
|
# if defined(__GNUC__)
|
||||||
|
# define FFI_MIPS_O32
|
||||||
|
# else
|
||||||
|
# if _MIPS_SIM==_ABIO32
|
||||||
|
# define FFI_MIPS_O32
|
||||||
|
# else
|
||||||
|
-- this is an unsupported platform --
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define v0 $2
|
||||||
|
#define v1 $3
|
||||||
|
#define a0 $4
|
||||||
|
#define a1 $5
|
||||||
|
#define a2 $6
|
||||||
|
#define a3 $7
|
||||||
|
#define a4 $8
|
||||||
|
#define a5 $9
|
||||||
|
#define a6 $10
|
||||||
|
#define a7 $11
|
||||||
|
#define t0 $8
|
||||||
|
#define t1 $9
|
||||||
|
#define t2 $10
|
||||||
|
#define t3 $11
|
||||||
|
#define t4 $12
|
||||||
|
#define t5 $13
|
||||||
|
#define t6 $14
|
||||||
|
#define t7 $15
|
||||||
|
#define t8 $24
|
||||||
|
#define t9 $25
|
||||||
|
#define ra $31
|
||||||
|
|
||||||
|
#if defined(FFI_MIPS_O32)
|
||||||
|
|
||||||
|
#define FFI_DEFAULT_ABI FFI_O32
|
||||||
|
|
||||||
|
/* O32 stack frames have 32bit integer args */
|
||||||
|
#define SLOT_TYPE_UNSIGNED UINT32
|
||||||
|
#define SLOT_TYPE_SIGNED SINT32
|
||||||
|
#define SIZEOF_ARG 4
|
||||||
|
|
||||||
|
#define REG_L lw
|
||||||
|
#define REG_S sw
|
||||||
|
#define SUBU subu
|
||||||
|
#define ADDU addu
|
||||||
|
#define SRL srl
|
||||||
|
#define LI li
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define FFI_DEFAULT_ABI FFI_N32
|
||||||
|
|
||||||
|
/* N32 and N64 frames have 64bit integer args */
|
||||||
|
#define SLOT_TYPE_UNSIGNED UINT64
|
||||||
|
#define SLOT_TYPE_SIGNED SINT64
|
||||||
|
#define SIZEOF_ARG 8
|
||||||
|
|
||||||
|
#define REG_L ld
|
||||||
|
#define REG_S sd
|
||||||
|
#define SUBU dsubu
|
||||||
|
#define ADDU daddu
|
||||||
|
#define SRL dsrl
|
||||||
|
#define LI dli
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FFI_FLAG_BITS 2
|
||||||
|
|
||||||
|
/* SGI's strange assembler requires that we multiply by 4 rather
|
||||||
|
than shift left by FFI_FLAG_BITS */
|
||||||
|
|
||||||
|
#define FFI_ARGS_D FFI_TYPE_DOUBLE
|
||||||
|
#define FFI_ARGS_F FFI_TYPE_FLOAT
|
||||||
|
#define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE
|
||||||
|
#define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT
|
||||||
|
#define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT
|
||||||
|
#define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE
|
||||||
|
|
||||||
|
/* Needed for N32 structure returns */
|
||||||
|
#define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8
|
||||||
|
#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* The SGI assembler can't handle this.. */
|
||||||
|
|
||||||
|
#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* ...so we calculate these by hand! */
|
||||||
|
|
||||||
|
#define FFI_TYPE_STRUCT_D 61
|
||||||
|
#define FFI_TYPE_STRUCT_F 45
|
||||||
|
#define FFI_TYPE_STRUCT_DD 253
|
||||||
|
#define FFI_TYPE_STRUCT_FF 173
|
||||||
|
#define FFI_TYPE_STRUCT_FD 237
|
||||||
|
#define FFI_TYPE_STRUCT_DF 189
|
||||||
|
#define FFI_TYPE_STRUCT_SMALL 93
|
||||||
|
#define FFI_TYPE_STRUCT_SMALL2 109
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
246
libffi/install-sh
Executable file
246
libffi/install-sh
Executable file
@@ -0,0 +1,246 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||||
|
#
|
||||||
|
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
# documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
# the above copyright notice appear in all copies and that both that
|
||||||
|
# copyright notice and this permission notice appear in supporting
|
||||||
|
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
|
# publicity pertaining to distribution of the software without specific,
|
||||||
|
# written prior permission. M.I.T. makes no representations about the
|
||||||
|
# suitability of this software for any purpose. It is provided "as is"
|
||||||
|
# without express or implied warranty.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit="${DOITPROG-}"
|
||||||
|
|
||||||
|
|
||||||
|
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||||
|
|
||||||
|
mvprog="${MVPROG-mv}"
|
||||||
|
cpprog="${CPPROG-cp}"
|
||||||
|
chmodprog="${CHMODPROG-chmod}"
|
||||||
|
chownprog="${CHOWNPROG-chown}"
|
||||||
|
chgrpprog="${CHGRPPROG-chgrp}"
|
||||||
|
stripprog="${STRIPPROG-strip}"
|
||||||
|
rmprog="${RMPROG-rm}"
|
||||||
|
mkdirprog="${MKDIRPROG-mkdir}"
|
||||||
|
|
||||||
|
transformbasename=""
|
||||||
|
transform_arg=""
|
||||||
|
instcmd="$mvprog"
|
||||||
|
chmodcmd="$chmodprog 0755"
|
||||||
|
chowncmd=""
|
||||||
|
chgrpcmd=""
|
||||||
|
stripcmd=""
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
mvcmd="$mvprog"
|
||||||
|
src=""
|
||||||
|
dst=""
|
||||||
|
dir_arg=""
|
||||||
|
|
||||||
|
while [ x"$1" != x ]; do
|
||||||
|
case $1 in
|
||||||
|
-c) instcmd="$cpprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-d) dir_arg=true
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-m) chmodcmd="$chmodprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-s) stripcmd="$stripprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
*) if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
src=$1
|
||||||
|
else
|
||||||
|
# this colon is to work around a 386BSD /bin/sh bug
|
||||||
|
:
|
||||||
|
dst=$1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no input file specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]; then
|
||||||
|
dst=$src
|
||||||
|
src=""
|
||||||
|
|
||||||
|
if [ -d $dst ]; then
|
||||||
|
instcmd=:
|
||||||
|
else
|
||||||
|
instcmd=mkdir
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
|
||||||
|
if [ -f $src -o -d $src ]
|
||||||
|
then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
echo "install: $src does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dst" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no destination specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; if your system
|
||||||
|
# does not like double slashes in filenames, you may need to add some logic
|
||||||
|
|
||||||
|
if [ -d $dst ]
|
||||||
|
then
|
||||||
|
dst="$dst"/`basename $src`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
## this sed command emulates the dirname command
|
||||||
|
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||||
|
|
||||||
|
# Make sure that the destination directory exists.
|
||||||
|
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||||
|
|
||||||
|
# Skip lots of stat calls in the usual case.
|
||||||
|
if [ ! -d "$dstdir" ]; then
|
||||||
|
defaultIFS='
|
||||||
|
'
|
||||||
|
IFS="${IFS-${defaultIFS}}"
|
||||||
|
|
||||||
|
oIFS="${IFS}"
|
||||||
|
# Some sh's can't handle IFS=/ for some reason.
|
||||||
|
IFS='%'
|
||||||
|
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||||
|
IFS="${oIFS}"
|
||||||
|
|
||||||
|
pathcomp=''
|
||||||
|
|
||||||
|
while [ $# -ne 0 ] ; do
|
||||||
|
pathcomp="${pathcomp}${1}"
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ ! -d "${pathcomp}" ] ;
|
||||||
|
then
|
||||||
|
$mkdirprog "${pathcomp}"
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
pathcomp="${pathcomp}/"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]
|
||||||
|
then
|
||||||
|
$doit $instcmd $dst &&
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# If we're going to rename the final executable, determine the name now.
|
||||||
|
|
||||||
|
if [ x"$transformarg" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
dstfile=`basename $dst $transformbasename |
|
||||||
|
sed $transformarg`$transformbasename
|
||||||
|
fi
|
||||||
|
|
||||||
|
# don't allow the sed command to completely eliminate the filename
|
||||||
|
|
||||||
|
if [ x"$dstfile" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make a temp file name in the proper directory.
|
||||||
|
|
||||||
|
dsttmp=$dstdir/#inst.$$#
|
||||||
|
|
||||||
|
# Move or copy the file name to the temp name
|
||||||
|
|
||||||
|
$doit $instcmd $src $dsttmp &&
|
||||||
|
|
||||||
|
trap "rm -f ${dsttmp}" 0 &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits
|
||||||
|
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
|
||||||
|
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||||
|
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||||
|
|
||||||
|
fi &&
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
||||||
1415
libffi/ltconfig
Executable file
1415
libffi/ltconfig
Executable file
File diff suppressed because it is too large
Load Diff
2372
libffi/ltmain.sh
Normal file
2372
libffi/ltmain.sh
Normal file
File diff suppressed because it is too large
Load Diff
134
libffi/missing
Executable file
134
libffi/missing
Executable file
@@ -0,0 +1,134 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
# 02111-1307, USA.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal touch file \`aclocal.m4'
|
||||||
|
autoconf touch file \`configure'
|
||||||
|
autoheader touch file \`config.h.in'
|
||||||
|
automake touch all \`Makefile.in' files
|
||||||
|
bison touch file \`y.tab.c'
|
||||||
|
makeinfo touch the output file
|
||||||
|
yacc touch file \`y.tab.c'"
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing - GNU libit 0.0"
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: Unknown \`$1' option"
|
||||||
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aclocal)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||||
|
you modified \`acinclude.m4' or \`configure.in'. You might want
|
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoconf)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||||
|
you modified \`configure.in'. You might want to install the
|
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||||
|
you modified \`acconfig.h' or \`configure.in'. You might want
|
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
touch config.h.in
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
|
||||||
|
You might want to install the \`Automake' and \`Perl' packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print \
|
||||||
|
| sed 's/^\(.*\).am$/touch \1.in/' \
|
||||||
|
| sh
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison|yacc)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. You should only need it if
|
||||||
|
you modified a \`.y' file. You may need the \`Bison' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Bison' from any GNU archive site."
|
||||||
|
touch y.tab.c
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy \`make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||||
|
the \`GNU make' package. Grab either from any GNU archive site."
|
||||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
||||||
|
if test -z "$file"; then
|
||||||
|
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
|
||||||
|
fi
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, and you do not seem to have it handy on your
|
||||||
|
system. You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the \`README' file,
|
||||||
|
it often tells you about the needed prerequirements for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing \`$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
32
libffi/mkinstalldirs
Executable file
32
libffi/mkinstalldirs
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# mkinstalldirs --- make directory hierarchy
|
||||||
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
||||||
|
# Created: 1993-05-16
|
||||||
|
# Public domain
|
||||||
|
|
||||||
|
errstatus=0
|
||||||
|
|
||||||
|
for file
|
||||||
|
do
|
||||||
|
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
|
||||||
|
shift
|
||||||
|
|
||||||
|
pathcomp=
|
||||||
|
for d in ${1+"$@"} ; do
|
||||||
|
pathcomp="$pathcomp$d"
|
||||||
|
case "$pathcomp" in
|
||||||
|
-* ) pathcomp=./$pathcomp ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test ! -d "$pathcomp"; then
|
||||||
|
echo "mkdir $pathcomp" 1>&2
|
||||||
|
mkdir "$pathcomp" || errstatus=$?
|
||||||
|
fi
|
||||||
|
|
||||||
|
pathcomp="$pathcomp/"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $errstatus
|
||||||
|
|
||||||
|
# mkinstalldirs ends here
|
||||||
100
libffi/src/Makefile.am
Normal file
100
libffi/src/Makefile.am
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
## Process this with automake to create Makefile.in
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
SUFFIXES = .c .lo .o .s .S
|
||||||
|
|
||||||
|
.deps/%.P: $(srcdir)/%.s
|
||||||
|
@echo "Computing dependencies for $<..."
|
||||||
|
@o='o'; \
|
||||||
|
test -n "$o" && o='$$o'; \
|
||||||
|
$(MKDEP) $< | sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," > $@
|
||||||
|
|
||||||
|
.deps/%.P: $(srcdir)/%.S
|
||||||
|
@echo "Computing dependencies for $<..."
|
||||||
|
@o='o'; \
|
||||||
|
test -n "$o" && o='$$o'; \
|
||||||
|
$(MKDEP) $< | sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," > $@
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libffi.la
|
||||||
|
noinst_PROGRAMS = ffitest
|
||||||
|
|
||||||
|
TARGET_SRC_MIPS_GCC = mips/ffi.c mips/o32.S mips/n32.S
|
||||||
|
TARGET_SRC_MIPS_SGI = mips/ffi.c mips/o32.s mips/n32.s
|
||||||
|
TARGET_SRC_X86 = x86/ffi.c x86/sysv.S
|
||||||
|
TARGET_SRC_SPARC = sparc/ffi.c sparc/v8.S
|
||||||
|
TARGET_SRC_ALPHA = alpha/ffi.c alpha/osf.S
|
||||||
|
TARGET_SRC_M68K = m68k/ffi.c m68k/sysv.S
|
||||||
|
TARGET_SRC_POWERPC = powerpc/ffi.c powerpc/sysv.S
|
||||||
|
TARGET_SRC_ARM = arm/sysv.S arm/ffi.c
|
||||||
|
|
||||||
|
##libffi_la_SOURCES = debug.c prep_cif.c types.c $(TARGET_SRC_@TARGET@)
|
||||||
|
## Work around automake deficiency
|
||||||
|
libffi_la_common_SOURCES = debug.c prep_cif.c types.c
|
||||||
|
if MIPS_GCC
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
||||||
|
endif
|
||||||
|
if MIPS_SGI
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
||||||
|
endif
|
||||||
|
if X86
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
|
||||||
|
endif
|
||||||
|
if SPARC
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC)
|
||||||
|
endif
|
||||||
|
if ALPHA
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA)
|
||||||
|
endif
|
||||||
|
if M68K
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K)
|
||||||
|
endif
|
||||||
|
if POWERPC
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC)
|
||||||
|
endif
|
||||||
|
if ARM
|
||||||
|
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
||||||
|
endif
|
||||||
|
|
||||||
|
libffi_la_LDFLAGS = -version-info 2:3:1
|
||||||
|
ffitest_SOURCES = ffitest.c
|
||||||
|
ffitest_LDADD = libffi.la
|
||||||
|
|
||||||
|
EXTRA_DIST = mips/ffi.c mips/n32.S mips/n32.s mips/o32.S mips/o32.s \
|
||||||
|
sparc/ffi.c sparc/v8.S \
|
||||||
|
x86/ffi.c x86/sysv.S \
|
||||||
|
alpha/ffi.c alpha/osf.S \
|
||||||
|
m68k/ffi.c m68k/sysv.S \
|
||||||
|
powerpc/ffi.c powerpc/sysv.S powerpc/asm.h \
|
||||||
|
arm/ffi.c arm/sysv.S
|
||||||
|
|
||||||
|
VPATH = @srcdir@:@srcdir@/@TARGETDIR@
|
||||||
|
|
||||||
|
if MIPS_SGI
|
||||||
|
|
||||||
|
%.o: %.s
|
||||||
|
$(COMPILE) -c $<
|
||||||
|
|
||||||
|
# This rule should only be used for compiling with the SGI assembler.
|
||||||
|
%.lo: %.s
|
||||||
|
$(LTCOMPILE) -c $<
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
# This is the general rule.
|
||||||
|
%.o: %.S
|
||||||
|
$(COMPILE) -c $<
|
||||||
|
|
||||||
|
# This is the general rule.
|
||||||
|
%.lo: %.S
|
||||||
|
$(LTCOMPILE) -c $<
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include -I../include
|
||||||
|
|
||||||
|
test: ffitest
|
||||||
|
./ffitest
|
||||||
|
|
||||||
|
lint:
|
||||||
|
$(LINT) $(INCLUDES) $(srcdir)/*.c $(srcdir)/@TARGETDIR@/*.c
|
||||||
409
libffi/src/Makefile.in
Normal file
409
libffi/src/Makefile.in
Normal file
@@ -0,0 +1,409 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.2 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy, distribute and modify it.
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = true
|
||||||
|
PRE_INSTALL = true
|
||||||
|
POST_INSTALL = true
|
||||||
|
NORMAL_UNINSTALL = true
|
||||||
|
PRE_UNINSTALL = true
|
||||||
|
POST_UNINSTALL = true
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CC = @CC@
|
||||||
|
LD = @LD@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
TARGET = @TARGET@
|
||||||
|
TARGETDIR = @TARGETDIR@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
SUFFIXES = .c .lo .o .s .S
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libffi.la
|
||||||
|
noinst_PROGRAMS = ffitest
|
||||||
|
|
||||||
|
TARGET_SRC_MIPS_GCC = mips/ffi.c mips/o32.S mips/n32.S
|
||||||
|
TARGET_SRC_MIPS_SGI = mips/ffi.c mips/o32.s mips/n32.s
|
||||||
|
TARGET_SRC_X86 = x86/ffi.c x86/sysv.S
|
||||||
|
TARGET_SRC_SPARC = sparc/ffi.c sparc/v8.S
|
||||||
|
TARGET_SRC_ALPHA = alpha/ffi.c alpha/osf.S
|
||||||
|
TARGET_SRC_M68K = m68k/ffi.c m68k/sysv.S
|
||||||
|
TARGET_SRC_POWERPC = powerpc/ffi.c powerpc/sysv.S
|
||||||
|
TARGET_SRC_ARM = arm/sysv.S arm/ffi.c
|
||||||
|
|
||||||
|
libffi_la_common_SOURCES = debug.c prep_cif.c types.c
|
||||||
|
@MIPS_GCC_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
||||||
|
@MIPS_SGI_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
||||||
|
@X86_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
|
||||||
|
@SPARC_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC)
|
||||||
|
@ALPHA_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA)
|
||||||
|
@M68K_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K)
|
||||||
|
@POWERPC_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC)
|
||||||
|
@ARM_TRUE@libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
||||||
|
|
||||||
|
libffi_la_LDFLAGS = -version-info 2:3:1
|
||||||
|
ffitest_SOURCES = ffitest.c
|
||||||
|
ffitest_LDADD = libffi.la
|
||||||
|
|
||||||
|
EXTRA_DIST = mips/ffi.c mips/n32.S mips/n32.s mips/o32.S mips/o32.s \
|
||||||
|
sparc/ffi.c sparc/v8.S \
|
||||||
|
x86/ffi.c x86/sysv.S \
|
||||||
|
alpha/ffi.c alpha/osf.S \
|
||||||
|
m68k/ffi.c m68k/sysv.S \
|
||||||
|
powerpc/ffi.c powerpc/sysv.S powerpc/asm.h \
|
||||||
|
arm/ffi.c arm/sysv.S
|
||||||
|
|
||||||
|
VPATH = @srcdir@:@srcdir@/@TARGETDIR@
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include -I../include
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../fficonfig.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
|
|
||||||
|
|
||||||
|
DEFS = @DEFS@ -I. -I$(srcdir) -I..
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
libffi_la_LIBADD =
|
||||||
|
@SPARC_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@SPARC_TRUE@v8.lo
|
||||||
|
@MIPS_SGI_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@MIPS_SGI_TRUE@o32.lo n32.lo
|
||||||
|
@MIPS_GCC_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@MIPS_GCC_TRUE@o32.lo n32.lo
|
||||||
|
@M68K_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@M68K_TRUE@sysv.lo
|
||||||
|
@ALPHA_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@ALPHA_TRUE@osf.lo
|
||||||
|
@X86_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@X86_TRUE@sysv.lo
|
||||||
|
@ARM_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo sysv.lo \
|
||||||
|
@ARM_TRUE@ffi.lo
|
||||||
|
@POWERPC_TRUE@libffi_la_OBJECTS = debug.lo prep_cif.lo types.lo ffi.lo \
|
||||||
|
@POWERPC_TRUE@sysv.lo
|
||||||
|
PROGRAMS = $(noinst_PROGRAMS)
|
||||||
|
|
||||||
|
ffitest_OBJECTS = ffitest.o
|
||||||
|
ffitest_DEPENDENCIES = libffi.la
|
||||||
|
ffitest_LDFLAGS =
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||||
|
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||||
|
LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@
|
||||||
|
DIST_COMMON = ChangeLog Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
DEP_FILES = .deps/debug.P .deps/ffi.P .deps/ffitest.P .deps/n32.P \
|
||||||
|
.deps/o32.P .deps/osf.P .deps/prep_cif.P .deps/sysv.P .deps/types.P \
|
||||||
|
.deps/v8.P
|
||||||
|
SOURCES = $(libffi_la_SOURCES) $(ffitest_SOURCES)
|
||||||
|
OBJECTS = $(libffi_la_OBJECTS) $(ffitest_OBJECTS)
|
||||||
|
|
||||||
|
default: all
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .S .c .lo .o .s
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-libLTLIBRARIES:
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES:
|
||||||
|
test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
|
||||||
|
distclean-libLTLIBRARIES:
|
||||||
|
|
||||||
|
maintainer-clean-libLTLIBRARIES:
|
||||||
|
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
$(mkinstalldirs) $(libdir)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
echo "$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(libdir)/$$p"; \
|
||||||
|
$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(libdir)/$$p; \
|
||||||
|
else :; fi; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES:
|
||||||
|
$(NORMAL_UNINSTALL)
|
||||||
|
list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||||
|
$(LIBTOOL) --mode=uninstall rm -f $(libdir)/$$p; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) -c $<
|
||||||
|
|
||||||
|
mostlyclean-compile:
|
||||||
|
rm -f *.o core
|
||||||
|
|
||||||
|
clean-compile:
|
||||||
|
|
||||||
|
distclean-compile:
|
||||||
|
rm -f *.tab.c
|
||||||
|
|
||||||
|
maintainer-clean-compile:
|
||||||
|
|
||||||
|
.c.lo:
|
||||||
|
$(LIBTOOL) --mode=compile $(COMPILE) -c $<
|
||||||
|
|
||||||
|
mostlyclean-libtool:
|
||||||
|
rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool:
|
||||||
|
rm -rf .libs
|
||||||
|
|
||||||
|
distclean-libtool:
|
||||||
|
|
||||||
|
maintainer-clean-libtool:
|
||||||
|
|
||||||
|
libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES)
|
||||||
|
$(LINK) -rpath $(libdir) $(libffi_la_LDFLAGS) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
mostlyclean-noinstPROGRAMS:
|
||||||
|
|
||||||
|
clean-noinstPROGRAMS:
|
||||||
|
test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
|
||||||
|
|
||||||
|
distclean-noinstPROGRAMS:
|
||||||
|
|
||||||
|
maintainer-clean-noinstPROGRAMS:
|
||||||
|
|
||||||
|
ffitest: $(ffitest_OBJECTS) $(ffitest_DEPENDENCIES)
|
||||||
|
@rm -f ffitest
|
||||||
|
$(LINK) $(ffitest_LDFLAGS) $(ffitest_OBJECTS) $(ffitest_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd` && cd $(srcdir) && mkid -f$$here/ID $(SOURCES) $(HEADERS)
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
test -z "$(ETAGS_ARGS)$(SOURCES)$(HEADERS)$$tags" \
|
||||||
|
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $(SOURCES) $(HEADERS) -o $$here/TAGS)
|
||||||
|
|
||||||
|
mostlyclean-tags:
|
||||||
|
|
||||||
|
clean-tags:
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
rm -f TAGS ID
|
||||||
|
|
||||||
|
maintainer-clean-tags:
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = src
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
here=`cd $(top_builddir) && pwd`; \
|
||||||
|
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||||
|
cd $(top_srcdir) \
|
||||||
|
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign src/Makefile
|
||||||
|
$(mkinstalldirs) $(distdir)/alpha $(distdir)/arm $(distdir)/m68k \
|
||||||
|
$(distdir)/mips $(distdir)/powerpc $(distdir)/sparc \
|
||||||
|
$(distdir)/x86
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
MKDEP = gcc -M $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||||
|
|
||||||
|
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
||||||
|
-include .deps/.P
|
||||||
|
.deps/.P: $(BUILT_SOURCES)
|
||||||
|
echo > $@
|
||||||
|
|
||||||
|
-include $(DEP_FILES)
|
||||||
|
|
||||||
|
mostlyclean-depend:
|
||||||
|
|
||||||
|
clean-depend:
|
||||||
|
|
||||||
|
distclean-depend:
|
||||||
|
|
||||||
|
maintainer-clean-depend:
|
||||||
|
rm -rf .deps
|
||||||
|
|
||||||
|
.deps/%.P: %.c
|
||||||
|
@echo "Computing dependencies for $<..."
|
||||||
|
@o='o'; \
|
||||||
|
test -n "$o" && o='$$o'; \
|
||||||
|
$(MKDEP) $< >$@.tmp \
|
||||||
|
&& sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," < $@.tmp > $@ \
|
||||||
|
&& rm -f $@.tmp
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec: install-libLTLIBRARIES
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall: uninstall-libLTLIBRARIES
|
||||||
|
|
||||||
|
all: Makefile $(LTLIBRARIES) $(PROGRAMS)
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
$(mkinstalldirs) $(libdir)
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-libLTLIBRARIES mostlyclean-compile \
|
||||||
|
mostlyclean-libtool mostlyclean-noinstPROGRAMS \
|
||||||
|
mostlyclean-tags mostlyclean-depend mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-libLTLIBRARIES clean-compile clean-libtool \
|
||||||
|
clean-noinstPROGRAMS clean-tags clean-depend \
|
||||||
|
clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-libLTLIBRARIES distclean-compile distclean-libtool \
|
||||||
|
distclean-noinstPROGRAMS distclean-tags \
|
||||||
|
distclean-depend distclean-generic clean
|
||||||
|
rm -f config.status
|
||||||
|
rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-libLTLIBRARIES \
|
||||||
|
maintainer-clean-compile maintainer-clean-libtool \
|
||||||
|
maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
|
||||||
|
maintainer-clean-depend maintainer-clean-generic \
|
||||||
|
distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: default mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \
|
||||||
|
clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \
|
||||||
|
uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \
|
||||||
|
distclean-compile clean-compile maintainer-clean-compile \
|
||||||
|
mostlyclean-libtool distclean-libtool clean-libtool \
|
||||||
|
maintainer-clean-libtool mostlyclean-noinstPROGRAMS \
|
||||||
|
distclean-noinstPROGRAMS clean-noinstPROGRAMS \
|
||||||
|
maintainer-clean-noinstPROGRAMS tags mostlyclean-tags distclean-tags \
|
||||||
|
clean-tags maintainer-clean-tags distdir mostlyclean-depend \
|
||||||
|
distclean-depend clean-depend maintainer-clean-depend info dvi \
|
||||||
|
installcheck install-exec install-data install uninstall all \
|
||||||
|
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||||
|
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
.deps/%.P: $(srcdir)/%.s
|
||||||
|
@echo "Computing dependencies for $<..."
|
||||||
|
@o='o'; \
|
||||||
|
test -n "$o" && o='$$o'; \
|
||||||
|
$(MKDEP) $< | sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," > $@
|
||||||
|
|
||||||
|
.deps/%.P: $(srcdir)/%.S
|
||||||
|
@echo "Computing dependencies for $<..."
|
||||||
|
@o='o'; \
|
||||||
|
test -n "$o" && o='$$o'; \
|
||||||
|
$(MKDEP) $< | sed "s,^\(.*\)\.o:,\1.$$o \1.l$$o $@:," > $@
|
||||||
|
|
||||||
|
@MIPS_SGI_TRUE@%.o: %.s
|
||||||
|
@MIPS_SGI_TRUE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
# This rule should only be used for compiling with the SGI assembler.
|
||||||
|
@MIPS_SGI_TRUE@%.lo: %.s
|
||||||
|
@MIPS_SGI_TRUE@ $(LTCOMPILE) -c $<
|
||||||
|
|
||||||
|
# This is the general rule.
|
||||||
|
@MIPS_SGI_FALSE@%.o: %.S
|
||||||
|
@MIPS_SGI_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
|
# This is the general rule.
|
||||||
|
@MIPS_SGI_FALSE@%.lo: %.S
|
||||||
|
@MIPS_SGI_FALSE@ $(LTCOMPILE) -c $<
|
||||||
|
|
||||||
|
test: ffitest
|
||||||
|
./ffitest
|
||||||
|
|
||||||
|
lint:
|
||||||
|
$(LINT) $(INCLUDES) $(srcdir)/*.c $(srcdir)/@TARGETDIR@/*.c
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
199
libffi/src/alpha/ffi.c
Normal file
199
libffi/src/alpha/ffi.c
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
Alpha Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments */
|
||||||
|
|
||||||
|
static void
|
||||||
|
ffi_prep_args(char *stack, extended_cif *ecif, int bytes, int flags)
|
||||||
|
{
|
||||||
|
register long i, avn;
|
||||||
|
register void **p_argv;
|
||||||
|
register char *argp;
|
||||||
|
register ffi_type **p_arg;
|
||||||
|
|
||||||
|
/* To streamline things in the assembly code, we always allocate 12
|
||||||
|
words for loading up the int and fp argument registers. The layout
|
||||||
|
is as when processing varargs: the 6 fp args, the 6 int args, then
|
||||||
|
the incoming stack. ARGP points to the first int slot. */
|
||||||
|
argp = stack + 6 * SIZEOF_ARG;
|
||||||
|
memset (stack, 0, 12 * SIZEOF_ARG);
|
||||||
|
|
||||||
|
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT )
|
||||||
|
{
|
||||||
|
*(void **) argp = ecif->rvalue;
|
||||||
|
argp += sizeof(void *);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_arg = ecif->cif->arg_types;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
while (i < avn)
|
||||||
|
{
|
||||||
|
size_t z = ALIGN((*p_arg)->size, SIZEOF_ARG);
|
||||||
|
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(SINT64 *) argp = *(SINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(UINT64 *) argp = *(UINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(SINT64 *) argp = *(SINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(UINT64 *) argp = *(UINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
*(SINT64 *) argp = *(SINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
*(UINT64 *) argp = *(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
case FFI_TYPE_POINTER:
|
||||||
|
*(UINT64 *) argp = *(UINT64 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
if (argp - stack < 12 * SIZEOF_ARG)
|
||||||
|
{
|
||||||
|
/* Note the conversion -- all the fp regs are loaded as
|
||||||
|
doubles. The in-register format is the same. */
|
||||||
|
*(double *) (argp - 6 * SIZEOF_ARG) = *(float *)(* p_argv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*(float *) argp = *(float *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
if (argp - stack < 12 * SIZEOF_ARG)
|
||||||
|
*(double *) (argp - 6 * SIZEOF_ARG) = *(double *)(* p_argv);
|
||||||
|
else
|
||||||
|
*(double *) argp = *(double *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
memcpy(argp, *p_argv, (*p_arg)->size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
argp += z;
|
||||||
|
i++, p_arg++, p_argv++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status
|
||||||
|
ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* Adjust cif->bytes. to include 12 words for the temporary register
|
||||||
|
argument loading area. This will be removed before the call. */
|
||||||
|
|
||||||
|
cif->bytes += 6*SIZEOF_ARG;
|
||||||
|
if (cif->bytes < 12*SIZEOF_ARG)
|
||||||
|
cif->bytes = 12*SIZEOF_ARG;
|
||||||
|
|
||||||
|
/* The stack must be double word aligned, so round bytes up
|
||||||
|
appropriately. */
|
||||||
|
|
||||||
|
cif->bytes = ALIGN(cif->bytes, 2*sizeof(void*));
|
||||||
|
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
cif->flags = cif->rtype->type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
cif->flags = FFI_TYPE_FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags = FFI_TYPE_DOUBLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags = FFI_TYPE_INT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int ffi_call_osf(void (*)(char *, extended_cif *, int, int),
|
||||||
|
extended_cif *, unsigned,
|
||||||
|
unsigned, unsigned *, void (*)());
|
||||||
|
|
||||||
|
void
|
||||||
|
ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return
|
||||||
|
value address then we need to make one. */
|
||||||
|
|
||||||
|
if (rvalue == NULL && cif->rtype->type == FFI_TYPE_STRUCT)
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_OSF:
|
||||||
|
ffi_call_osf(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, rvalue, fn);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
118
libffi/src/alpha/osf.S
Normal file
118
libffi/src/alpha/osf.S
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
osf.S - Copyright (c) 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
Alpha/OSF Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: osf.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
#define callback $16
|
||||||
|
#define ecifp $17
|
||||||
|
#define bytes $18
|
||||||
|
#define flags $19
|
||||||
|
#define raddr $20
|
||||||
|
#define fn $21
|
||||||
|
|
||||||
|
#define flags_ofs 16
|
||||||
|
#define raddr_ofs 24
|
||||||
|
#define fn_ofs 32
|
||||||
|
|
||||||
|
#define SIZEOF_FRAME (6*8)
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 4
|
||||||
|
.globl ffi_call_osf
|
||||||
|
.ent ffi_call_osf
|
||||||
|
|
||||||
|
ffi_call_osf:
|
||||||
|
lda $30, -SIZEOF_FRAME($30)
|
||||||
|
stq $26, 0($30)
|
||||||
|
stq $15, 8($30)
|
||||||
|
stq flags, flags_ofs($30)
|
||||||
|
stq raddr, raddr_ofs($30)
|
||||||
|
stq fn, fn_ofs($30)
|
||||||
|
mov $30, $15
|
||||||
|
.frame $15, SIZEOF_FRAME, $26, 0
|
||||||
|
.mask 0x4008000, -SIZEOF_FRAME
|
||||||
|
.prologue 0
|
||||||
|
|
||||||
|
mov callback, $27 # mov callback into place
|
||||||
|
subq $30, bytes, $30 # allocate stack space
|
||||||
|
|
||||||
|
# Call ffi_prep_args; ecif, bytes and flags are already in place.
|
||||||
|
mov $30, $16 # push stack arg
|
||||||
|
jsr $26, ($27), 0
|
||||||
|
|
||||||
|
# Load up all of the (potential) argument registers.
|
||||||
|
ldt $f16, 0($30)
|
||||||
|
ldt $f17, 8($30)
|
||||||
|
ldt $f18, 16($30)
|
||||||
|
ldt $f19, 24($30)
|
||||||
|
ldt $f20, 32($30)
|
||||||
|
ldt $f21, 40($30)
|
||||||
|
ldq $16, 48($30)
|
||||||
|
ldq $17, 56($30)
|
||||||
|
ldq $18, 64($30)
|
||||||
|
ldq $19, 72($30)
|
||||||
|
ldq $20, 80($30)
|
||||||
|
ldq $21, 88($30)
|
||||||
|
|
||||||
|
# Get rid of the arg reg temp space and call the function.
|
||||||
|
ldq $27, fn_ofs($15)
|
||||||
|
lda $30, 12*8($30)
|
||||||
|
jsr $26, ($27), 0
|
||||||
|
|
||||||
|
# If the return value pointer is NULL, assume no return value.
|
||||||
|
ldq raddr, raddr_ofs($15)
|
||||||
|
beq raddr, $noretval
|
||||||
|
|
||||||
|
ldq flags, flags_ofs($15)
|
||||||
|
cmpeq flags, FFI_TYPE_INT, $1
|
||||||
|
bne $1, $retint
|
||||||
|
cmpeq flags, FFI_TYPE_FLOAT, $2
|
||||||
|
bne $2, $retfloat
|
||||||
|
cmpeq flags, FFI_TYPE_DOUBLE, $3
|
||||||
|
bne $3, $retdouble
|
||||||
|
br $retstruct
|
||||||
|
|
||||||
|
.align 3
|
||||||
|
$retint:
|
||||||
|
stq $0, 0(raddr)
|
||||||
|
br $noretval
|
||||||
|
$retfloat:
|
||||||
|
sts $f0, 0(raddr)
|
||||||
|
br $noretval
|
||||||
|
$retdouble:
|
||||||
|
stt $f0, 0(raddr)
|
||||||
|
|
||||||
|
$retstruct:
|
||||||
|
$noretval:
|
||||||
|
mov $15, $30
|
||||||
|
ldq $26, 0($15)
|
||||||
|
ldq $15, 8($15)
|
||||||
|
lda $30, SIZEOF_FRAME($30)
|
||||||
|
ret
|
||||||
|
|
||||||
|
.end ffi_call_osf
|
||||||
185
libffi/src/arm/ffi.c
Normal file
185
libffi/src/arm/ffi.c
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
ARM Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments */
|
||||||
|
|
||||||
|
/*@-exportheader@*/
|
||||||
|
void ffi_prep_args(char *stack, extended_cif *ecif)
|
||||||
|
/*@=exportheader@*/
|
||||||
|
{
|
||||||
|
register unsigned int i;
|
||||||
|
register int tmp;
|
||||||
|
register unsigned int avn;
|
||||||
|
register void **p_argv;
|
||||||
|
register char *argp;
|
||||||
|
register ffi_type **p_arg;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
|
argp = stack;
|
||||||
|
|
||||||
|
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
|
||||||
|
*(void **) argp = ecif->rvalue;
|
||||||
|
argp += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
|
||||||
|
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
||||||
|
(i != 0) && (avn != 0);
|
||||||
|
i--, p_arg++)
|
||||||
|
{
|
||||||
|
size_t z;
|
||||||
|
|
||||||
|
/* Align if necessary */
|
||||||
|
if (((*p_arg)->alignment - 1) & (unsigned) argp) {
|
||||||
|
argp = (char *) ALIGN(argp, (*p_arg)->alignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (avn != 0)
|
||||||
|
{
|
||||||
|
avn--;
|
||||||
|
z = (*p_arg)->size;
|
||||||
|
if (z < sizeof(int))
|
||||||
|
{
|
||||||
|
z = sizeof(int);
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (z == sizeof(int))
|
||||||
|
{
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(argp, *p_argv, z);
|
||||||
|
}
|
||||||
|
p_argv++;
|
||||||
|
argp += z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags = (unsigned) cif->rtype->type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags = FFI_TYPE_INT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@-declundef@*/
|
||||||
|
/*@-exportheader@*/
|
||||||
|
extern void ffi_call_SYSV(void (*)(char *, extended_cif *),
|
||||||
|
/*@out@*/ extended_cif *,
|
||||||
|
unsigned, unsigned,
|
||||||
|
/*@out@*/ unsigned *,
|
||||||
|
void (*fn)());
|
||||||
|
/*@=declundef@*/
|
||||||
|
/*@=exportheader@*/
|
||||||
|
|
||||||
|
void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
||||||
|
void (*fn)(),
|
||||||
|
/*@out@*/ void *rvalue,
|
||||||
|
/*@dependent@*/ void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return */
|
||||||
|
/* value address then we need to make one */
|
||||||
|
|
||||||
|
if ((rvalue == NULL) &&
|
||||||
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
||||||
|
{
|
||||||
|
/*@-sysunrecog@*/
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
/*@=sysunrecog@*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_SYSV:
|
||||||
|
/*@-usedef@*/
|
||||||
|
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, ecif.rvalue, fn);
|
||||||
|
/*@=usedef@*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
119
libffi/src/arm/sysv.S
Normal file
119
libffi/src/arm/sysv.S
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
sysv.S - Copyright (c) 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
ARM Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: sysv.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
#ifdef HAVE_MACHINE_ASM_H
|
||||||
|
#include <machine/asm.h>
|
||||||
|
#else
|
||||||
|
/* XXX these lose for some platforms, I'm sure. */
|
||||||
|
#define CNAME(x) x
|
||||||
|
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
# a1: ffi_prep_args
|
||||||
|
# a2: &ecif
|
||||||
|
# a3: cif->bytes
|
||||||
|
# a4: fig->flags
|
||||||
|
# sp+0: ecif.rvalue
|
||||||
|
# sp+4: fn
|
||||||
|
|
||||||
|
# This assumes we are using gas.
|
||||||
|
ENTRY(ffi_call_SYSV)
|
||||||
|
# Save registers
|
||||||
|
stmfd sp!, {a1-a4, fp, lr}
|
||||||
|
mov fp, sp
|
||||||
|
|
||||||
|
# Make room for all of the new args.
|
||||||
|
sub sp, fp, a3
|
||||||
|
|
||||||
|
# Place all of the ffi_prep_args in position
|
||||||
|
mov ip, a1
|
||||||
|
mov a1, sp
|
||||||
|
# a2 already set
|
||||||
|
|
||||||
|
# And call
|
||||||
|
mov lr, pc
|
||||||
|
mov pc, ip
|
||||||
|
|
||||||
|
# move first 4 parameters in registers
|
||||||
|
ldr a1, [sp, #0]
|
||||||
|
ldr a2, [sp, #4]
|
||||||
|
ldr a3, [sp, #8]
|
||||||
|
ldr a4, [sp, #12]
|
||||||
|
|
||||||
|
# and adjust stack
|
||||||
|
ldr ip, [fp, #8]
|
||||||
|
cmp ip, #16
|
||||||
|
movge ip, #16
|
||||||
|
add sp, sp, ip
|
||||||
|
|
||||||
|
# call function
|
||||||
|
mov lr, pc
|
||||||
|
ldr pc, [fp, #28]
|
||||||
|
|
||||||
|
# Remove the space we pushed for the args
|
||||||
|
mov sp, fp
|
||||||
|
|
||||||
|
# Load a3 with the pointer to storage for the return value
|
||||||
|
ldr a3, [sp, #24]
|
||||||
|
|
||||||
|
# Load a4 with the return type code
|
||||||
|
ldr a4, [sp, #12]
|
||||||
|
|
||||||
|
# If the return value pointer is NULL, assume no return value.
|
||||||
|
cmp a3, #0
|
||||||
|
beq epilogue
|
||||||
|
|
||||||
|
# return INT
|
||||||
|
cmp a4, #FFI_TYPE_INT
|
||||||
|
streq a1, [a3]
|
||||||
|
beq epilogue
|
||||||
|
|
||||||
|
# return FLOAT
|
||||||
|
cmp a4, #FFI_TYPE_FLOAT
|
||||||
|
bne retdouble
|
||||||
|
stfs f0, [a3]
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
# return DOUBLE or LONGDOUBLE
|
||||||
|
retdouble:
|
||||||
|
cmp a4, #FFI_TYPE_DOUBLE
|
||||||
|
bne epilogue
|
||||||
|
|
||||||
|
stfs f0, [a3, #0]
|
||||||
|
stfs f1, [a3, #4]
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
epilogue:
|
||||||
|
ldmfd sp!, {a1-a4, fp, pc}
|
||||||
|
|
||||||
|
.ffi_call_SYSV_end:
|
||||||
|
.size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
|
||||||
|
|
||||||
67
libffi/src/debug.c
Normal file
67
libffi/src/debug.c
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
debug.c - Copyright (c) 1996 Cygnus Solutions
|
||||||
|
|
||||||
|
$Id: debug.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* General debugging routines */
|
||||||
|
|
||||||
|
void ffi_stop_here(void)
|
||||||
|
{
|
||||||
|
/* This function is only useful for debugging purposes.
|
||||||
|
Place a breakpoint on ffi_stop_here to be notified of
|
||||||
|
significant events. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function should only be called via the FFI_ASSERT() macro */
|
||||||
|
|
||||||
|
int ffi_assert(char *file, int line)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ASSERTION FAILURE: %s line %d\n", file, line);
|
||||||
|
ffi_stop_here();
|
||||||
|
abort();
|
||||||
|
|
||||||
|
/* This has to return something for the compiler not to complain */
|
||||||
|
/*@notreached@*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform a sanity check on an ffi_type structure */
|
||||||
|
|
||||||
|
bool ffi_type_test(ffi_type *a)
|
||||||
|
{
|
||||||
|
/*@-usedef@*/
|
||||||
|
FFI_ASSERT(a->type <= FFI_TYPE_LAST);
|
||||||
|
FFI_ASSERT(a->type > FFI_TYPE_VOID ? a->size > 0 : 1);
|
||||||
|
FFI_ASSERT(a->type > FFI_TYPE_VOID ? a->alignment > 0 : 1);
|
||||||
|
FFI_ASSERT(a->type == FFI_TYPE_STRUCT ? a->elements != NULL : 1);
|
||||||
|
/*@=usedef@*/
|
||||||
|
|
||||||
|
/* This is a silly thing to return, but it keeps the compiler from
|
||||||
|
issuing warnings about "a" not being used in non-debug builds. */
|
||||||
|
return (a != NULL);
|
||||||
|
}
|
||||||
701
libffi/src/ffitest.c
Normal file
701
libffi/src/ffitest.c
Normal file
@@ -0,0 +1,701 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffitest.c - Copyright (c) 1996, 1997, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
$Id: ffitest.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
/* This is lame. Long double support is barely there under SunOS 4.x */
|
||||||
|
#if defined(SPARC) && (SIZEOF_LONG_DOUBLE != 16)
|
||||||
|
#define BROKEN_LONG_DOUBLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CHECK(x) !(x) ? fail(__FILE__, __LINE__) : 0
|
||||||
|
|
||||||
|
static int fail(char *file, int line)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Test failure: %s line %d\n", file, line);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
/*@notreached@*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAX_ARGS 256
|
||||||
|
|
||||||
|
static size_t my_strlen(char *s)
|
||||||
|
{
|
||||||
|
return (strlen(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int promotion(signed char sc, signed short ss,
|
||||||
|
unsigned char uc, unsigned short us)
|
||||||
|
{
|
||||||
|
int r = (int) sc + (int) ss + (int) uc + (int) us;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static signed char return_sc(signed char sc)
|
||||||
|
{
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char return_uc(unsigned char uc)
|
||||||
|
{
|
||||||
|
return uc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long long return_ll(long long ll)
|
||||||
|
{
|
||||||
|
return ll;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int floating(int a, float b, double c, long double d, int e)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This is ifdef'd out for now. long double support under SunOS/gcc
|
||||||
|
is pretty much non-existent. You'll get the odd bus error in library
|
||||||
|
routines like printf(). */
|
||||||
|
printf("%d %f %f %Lf %d\n", a, (double)b, c, d, e);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
i = (int) ((float)a/b + ((float)c/(float)d));
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float many(float f1,
|
||||||
|
float f2,
|
||||||
|
float f3,
|
||||||
|
float f4,
|
||||||
|
float f5,
|
||||||
|
float f6,
|
||||||
|
float f7,
|
||||||
|
float f8,
|
||||||
|
float f9,
|
||||||
|
float f10,
|
||||||
|
float f11,
|
||||||
|
float f12,
|
||||||
|
float f13)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
|
||||||
|
(double) f1, (double) f2, (double) f3, (double) f4, (double) f5,
|
||||||
|
(double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
|
||||||
|
(double) f11, (double) f12, (double) f13);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
|
||||||
|
}
|
||||||
|
|
||||||
|
static double dblit(float f)
|
||||||
|
{
|
||||||
|
return f/3.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long double ldblit(float f)
|
||||||
|
{
|
||||||
|
return (long double) (((long double) f)/ (long double) 3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char uc;
|
||||||
|
double d;
|
||||||
|
unsigned int ui;
|
||||||
|
} test_structure_1;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double d1;
|
||||||
|
double d2;
|
||||||
|
} test_structure_2;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int si;
|
||||||
|
} test_structure_3;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned ui1;
|
||||||
|
unsigned ui2;
|
||||||
|
unsigned ui3;
|
||||||
|
} test_structure_4;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char c1;
|
||||||
|
char c2;
|
||||||
|
} test_structure_5;
|
||||||
|
|
||||||
|
static test_structure_1 struct1(test_structure_1 ts)
|
||||||
|
{
|
||||||
|
/*@-type@*/
|
||||||
|
ts.uc++;
|
||||||
|
/*@=type@*/
|
||||||
|
ts.d--;
|
||||||
|
ts.ui++;
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static test_structure_2 struct2(test_structure_2 ts)
|
||||||
|
{
|
||||||
|
ts.d1--;
|
||||||
|
ts.d2--;
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static test_structure_3 struct3(test_structure_3 ts)
|
||||||
|
{
|
||||||
|
ts.si = -(ts.si*2);
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static test_structure_4 struct4(test_structure_4 ts)
|
||||||
|
{
|
||||||
|
ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2)
|
||||||
|
{
|
||||||
|
ts1.c1 += ts2.c1;
|
||||||
|
ts1.c2 -= ts2.c2;
|
||||||
|
|
||||||
|
return ts1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(/*@unused@*/ int argc, /*@unused@*/ char *argv[])
|
||||||
|
{
|
||||||
|
ffi_cif cif;
|
||||||
|
ffi_type *args[MAX_ARGS];
|
||||||
|
void *values[MAX_ARGS];
|
||||||
|
char *s;
|
||||||
|
signed char sc;
|
||||||
|
unsigned char uc;
|
||||||
|
signed short ss;
|
||||||
|
unsigned short us;
|
||||||
|
unsigned long ul;
|
||||||
|
long long ll;
|
||||||
|
float f;
|
||||||
|
double d;
|
||||||
|
long double ld;
|
||||||
|
signed int si1;
|
||||||
|
signed int si2;
|
||||||
|
|
||||||
|
#if defined(ALPHA) || (defined(MIPS) && (_MIPS_SIM == _ABIN32))
|
||||||
|
long long rint;
|
||||||
|
#else
|
||||||
|
int rint;
|
||||||
|
#endif
|
||||||
|
long long rlonglong;
|
||||||
|
|
||||||
|
ffi_type ts1_type;
|
||||||
|
ffi_type ts2_type;
|
||||||
|
ffi_type ts3_type;
|
||||||
|
ffi_type ts4_type;
|
||||||
|
ffi_type ts5_type;
|
||||||
|
ffi_type *ts1_type_elements[4];
|
||||||
|
ffi_type *ts2_type_elements[3];
|
||||||
|
ffi_type *ts3_type_elements[2];
|
||||||
|
ffi_type *ts4_type_elements[4];
|
||||||
|
ffi_type *ts5_type_elements[3];
|
||||||
|
|
||||||
|
ts1_type.size = 0;
|
||||||
|
ts1_type.alignment = 0;
|
||||||
|
ts1_type.type = FFI_TYPE_STRUCT;
|
||||||
|
|
||||||
|
ts2_type.size = 0;
|
||||||
|
ts2_type.alignment = 0;
|
||||||
|
ts2_type.type = FFI_TYPE_STRUCT;
|
||||||
|
|
||||||
|
ts3_type.size = 0;
|
||||||
|
ts3_type.alignment = 0;
|
||||||
|
ts3_type.type = FFI_TYPE_STRUCT;
|
||||||
|
|
||||||
|
ts4_type.size = 0;
|
||||||
|
ts4_type.alignment = 0;
|
||||||
|
ts4_type.type = FFI_TYPE_STRUCT;
|
||||||
|
|
||||||
|
ts5_type.size = 0;
|
||||||
|
ts5_type.alignment = 0;
|
||||||
|
ts5_type.type = FFI_TYPE_STRUCT;
|
||||||
|
|
||||||
|
/*@-immediatetrans@*/
|
||||||
|
ts1_type.elements = ts1_type_elements;
|
||||||
|
ts2_type.elements = ts2_type_elements;
|
||||||
|
ts3_type.elements = ts3_type_elements;
|
||||||
|
ts4_type.elements = ts4_type_elements;
|
||||||
|
ts5_type.elements = ts5_type_elements;
|
||||||
|
/*@=immediatetrans@*/
|
||||||
|
|
||||||
|
ts1_type_elements[0] = &ffi_type_uchar;
|
||||||
|
ts1_type_elements[1] = &ffi_type_double;
|
||||||
|
ts1_type_elements[2] = &ffi_type_uint;
|
||||||
|
ts1_type_elements[3] = NULL;
|
||||||
|
|
||||||
|
ts2_type_elements[0] = &ffi_type_double;
|
||||||
|
ts2_type_elements[1] = &ffi_type_double;
|
||||||
|
ts2_type_elements[2] = NULL;
|
||||||
|
|
||||||
|
ts3_type_elements[0] = &ffi_type_sint;
|
||||||
|
ts3_type_elements[1] = NULL;
|
||||||
|
|
||||||
|
ts4_type_elements[0] = &ffi_type_uint;
|
||||||
|
ts4_type_elements[1] = &ffi_type_uint;
|
||||||
|
ts4_type_elements[2] = &ffi_type_uint;
|
||||||
|
ts4_type_elements[3] = NULL;
|
||||||
|
|
||||||
|
ts5_type_elements[0] = &ffi_type_schar;
|
||||||
|
ts5_type_elements[1] = &ffi_type_schar;
|
||||||
|
ts5_type_elements[2] = NULL;
|
||||||
|
|
||||||
|
ul = 0;
|
||||||
|
|
||||||
|
/* return value tests */
|
||||||
|
{
|
||||||
|
#if defined(MIPS) || defined(SPARC) /* || defined(ARM) */
|
||||||
|
puts ("long long tests not run. This is a known bug on this architecture.");
|
||||||
|
#else
|
||||||
|
args[0] = &ffi_type_sint64;
|
||||||
|
values[0] = ≪
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_sint64, args) == FFI_OK);
|
||||||
|
|
||||||
|
for (ll = 0LL; ll < 100LL; ll++)
|
||||||
|
{
|
||||||
|
ul++;
|
||||||
|
ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
|
||||||
|
CHECK(rlonglong == ll);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ll = 55555555555000LL; ll < 55555555555100LL; ll++)
|
||||||
|
{
|
||||||
|
ul++;
|
||||||
|
ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
|
||||||
|
CHECK(rlonglong == ll);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
args[0] = &ffi_type_schar;
|
||||||
|
values[0] = ≻
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_schar, args) == FFI_OK);
|
||||||
|
|
||||||
|
for (sc = (signed char) -127;
|
||||||
|
sc < (signed char) 127; /*@-type@*/ sc++ /*@=type@*/)
|
||||||
|
{
|
||||||
|
ul++;
|
||||||
|
ffi_call(&cif, FFI_FN(return_sc), &rint, values);
|
||||||
|
CHECK(rint == (int) sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
args[0] = &ffi_type_uchar;
|
||||||
|
values[0] = &uc;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_uchar, args) == FFI_OK);
|
||||||
|
|
||||||
|
for (uc = (unsigned char) '\x00';
|
||||||
|
uc < (unsigned char) '\xff'; /*@-type@*/ uc++ /*@=type@*/)
|
||||||
|
{
|
||||||
|
ul++;
|
||||||
|
ffi_call(&cif, FFI_FN(return_uc), &rint, values);
|
||||||
|
CHECK(rint == (signed int) uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%lu return value tests run\n", ul);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BROKEN_LONG_DOUBLE
|
||||||
|
printf ("This architecture has broken `long double' support. No floating point\ntests have been run.\n");
|
||||||
|
#else
|
||||||
|
/* float arg tests */
|
||||||
|
{
|
||||||
|
args[0] = &ffi_type_float;
|
||||||
|
values[0] = &f;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_longdouble, args) == FFI_OK);
|
||||||
|
|
||||||
|
f = 3.14159;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This is ifdef'd out for now. long double support under SunOS/gcc
|
||||||
|
is pretty much non-existent. You'll get the odd bus error in library
|
||||||
|
routines like printf(). */
|
||||||
|
printf ("%Lf\n", ldblit(f));
|
||||||
|
#endif
|
||||||
|
ld = 666;
|
||||||
|
ffi_call(&cif, FFI_FN(ldblit), &ld, values);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This is ifdef'd out for now. long double support under SunOS/gcc
|
||||||
|
is pretty much non-existent. You'll get the odd bus error in library
|
||||||
|
routines like printf(). */
|
||||||
|
printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* These are not always the same!! Check for a reasonable delta */
|
||||||
|
/*@-realcompare@*/
|
||||||
|
if (ld - ldblit(f) < LDBL_EPSILON)
|
||||||
|
/*@=realcompare@*/
|
||||||
|
puts("long double return value tests ok!");
|
||||||
|
else
|
||||||
|
CHECK(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* float arg tests */
|
||||||
|
{
|
||||||
|
args[0] = &ffi_type_sint;
|
||||||
|
values[0] = &si1;
|
||||||
|
args[1] = &ffi_type_float;
|
||||||
|
values[1] = &f;
|
||||||
|
args[2] = &ffi_type_double;
|
||||||
|
values[2] = &d;
|
||||||
|
args[3] = &ffi_type_longdouble;
|
||||||
|
values[3] = &ld;
|
||||||
|
args[4] = &ffi_type_sint;
|
||||||
|
values[4] = &si2;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 5,
|
||||||
|
&ffi_type_sint, args) == FFI_OK);
|
||||||
|
|
||||||
|
si1 = 6;
|
||||||
|
f = 3.14159;
|
||||||
|
d = (double)1.0/(double)3.0;
|
||||||
|
ld = 2.71828182846L;
|
||||||
|
si2 = 10;
|
||||||
|
|
||||||
|
floating (si1, f, d, ld, si2);
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(floating), &rint, values);
|
||||||
|
|
||||||
|
printf ("%d vs %d\n", rint, floating (si1, f, d, ld, si2));
|
||||||
|
|
||||||
|
CHECK(rint == floating(si1, f, d, ld, si2));
|
||||||
|
|
||||||
|
printf("float arg tests ok!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* strlen tests */
|
||||||
|
{
|
||||||
|
args[0] = &ffi_type_pointer;
|
||||||
|
values[0] = (void*) &s;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_sint, args) == FFI_OK);
|
||||||
|
|
||||||
|
s = "a";
|
||||||
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
||||||
|
CHECK(rint == 1);
|
||||||
|
|
||||||
|
s = "1234567";
|
||||||
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
||||||
|
CHECK(rint == 7);
|
||||||
|
|
||||||
|
s = "1234567890123456789012345";
|
||||||
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
||||||
|
CHECK(rint == 25);
|
||||||
|
|
||||||
|
printf("strlen tests passed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* float arg tests */
|
||||||
|
{
|
||||||
|
args[0] = &ffi_type_float;
|
||||||
|
values[0] = &f;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ffi_type_double, args) == FFI_OK);
|
||||||
|
|
||||||
|
f = 3.14159;
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(dblit), &d, values);
|
||||||
|
|
||||||
|
/* These are not always the same!! Check for a reasonable delta */
|
||||||
|
/*@-realcompare@*/
|
||||||
|
CHECK(d - dblit(f) < DBL_EPSILON);
|
||||||
|
/*@=realcompare@*/
|
||||||
|
|
||||||
|
printf("double return value tests ok!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* many arg tests */
|
||||||
|
{
|
||||||
|
float ff;
|
||||||
|
float fa[13];
|
||||||
|
|
||||||
|
for (ul = 0; ul < 13; ul++)
|
||||||
|
{
|
||||||
|
args[ul] = &ffi_type_float;
|
||||||
|
values[ul] = &fa[ul];
|
||||||
|
fa[ul] = (float) ul;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13,
|
||||||
|
&ffi_type_float, args) == FFI_OK);
|
||||||
|
|
||||||
|
/*@-usedef@*/
|
||||||
|
ff = many(fa[0], fa[1],
|
||||||
|
fa[2], fa[3],
|
||||||
|
fa[4], fa[5],
|
||||||
|
fa[6], fa[7],
|
||||||
|
fa[8], fa[9],
|
||||||
|
fa[10],fa[11],fa[12]);
|
||||||
|
/*@=usedef@*/
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(many), &f, values);
|
||||||
|
|
||||||
|
/*@-realcompare@*/
|
||||||
|
if (f - ff < FLT_EPSILON)
|
||||||
|
/*@=realcompare@*/
|
||||||
|
printf("many arg tests ok!\n");
|
||||||
|
else
|
||||||
|
#ifdef POWERPC
|
||||||
|
printf("many arg tests failed! This is a gcc bug.\n");
|
||||||
|
#else
|
||||||
|
CHECK(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* promotion tests */
|
||||||
|
{
|
||||||
|
args[0] = &ffi_type_schar;
|
||||||
|
args[1] = &ffi_type_sshort;
|
||||||
|
args[2] = &ffi_type_uchar;
|
||||||
|
args[3] = &ffi_type_ushort;
|
||||||
|
values[0] = ≻
|
||||||
|
values[1] = &ss;
|
||||||
|
values[2] = &uc;
|
||||||
|
values[3] = &us;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
|
||||||
|
&ffi_type_sint, args) == FFI_OK);
|
||||||
|
|
||||||
|
us = 0;
|
||||||
|
ul = 0;
|
||||||
|
|
||||||
|
for (sc = (signed char) -127;
|
||||||
|
sc <= (signed char) 120; /*@-type@*/ sc += 1 /*@=type@*/)
|
||||||
|
for (ss = -30000; ss <= 30000; ss += 10000)
|
||||||
|
for (uc = (unsigned char) 0;
|
||||||
|
uc <= (unsigned char) 200; /*@-type@*/ uc += 20 /*@=type@*/)
|
||||||
|
for (us = 0; us <= 60000; us += 10000)
|
||||||
|
{
|
||||||
|
ul++;
|
||||||
|
ffi_call(&cif, FFI_FN(promotion), &rint, values);
|
||||||
|
CHECK(rint == (int) sc + (int) ss + (int) uc + (int) us);
|
||||||
|
}
|
||||||
|
printf("%lu promotion tests run\n", ul);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct tests */
|
||||||
|
{
|
||||||
|
test_structure_1 ts1_arg;
|
||||||
|
/* This is a hack to get a properly aligned result buffer */
|
||||||
|
test_structure_1 *ts1_result =
|
||||||
|
(test_structure_1 *) malloc (sizeof(test_structure_1));
|
||||||
|
|
||||||
|
args[0] = &ts1_type;
|
||||||
|
values[0] = &ts1_arg;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ts1_type, args) == FFI_OK);
|
||||||
|
|
||||||
|
ts1_arg.uc = '\x01';
|
||||||
|
ts1_arg.d = 3.14159;
|
||||||
|
ts1_arg.ui = 555;
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
|
||||||
|
|
||||||
|
CHECK(ts1_result->ui == 556);
|
||||||
|
CHECK(ts1_result->d == 3.14159 - 1);
|
||||||
|
|
||||||
|
puts ("structure test 1 ok!\n");
|
||||||
|
|
||||||
|
free (ts1_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct tests */
|
||||||
|
{
|
||||||
|
test_structure_2 ts2_arg;
|
||||||
|
|
||||||
|
/* This is a hack to get a properly aligned result buffer */
|
||||||
|
test_structure_2 *ts2_result =
|
||||||
|
(test_structure_2 *) malloc (sizeof(test_structure_2));
|
||||||
|
|
||||||
|
args[0] = &ts2_type;
|
||||||
|
values[0] = &ts2_arg;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ts2_type, args) == FFI_OK);
|
||||||
|
|
||||||
|
ts2_arg.d1 = 5.55;
|
||||||
|
ts2_arg.d2 = 6.66;
|
||||||
|
|
||||||
|
printf ("%g\n", ts2_result->d1);
|
||||||
|
printf ("%g\n", ts2_result->d2);
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(struct2), ts2_result, values);
|
||||||
|
|
||||||
|
printf ("%g\n", ts2_result->d1);
|
||||||
|
printf ("%g\n", ts2_result->d2);
|
||||||
|
|
||||||
|
CHECK(ts2_result->d1 == 5.55 - 1);
|
||||||
|
CHECK(ts2_result->d2 == 6.66 - 1);
|
||||||
|
|
||||||
|
printf("structure test 2 ok!\n");
|
||||||
|
|
||||||
|
free (ts2_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct tests */
|
||||||
|
{
|
||||||
|
int compare_value;
|
||||||
|
test_structure_3 ts3_arg;
|
||||||
|
test_structure_3 *ts3_result =
|
||||||
|
(test_structure_3 *) malloc (sizeof(test_structure_3));
|
||||||
|
|
||||||
|
args[0] = &ts3_type;
|
||||||
|
values[0] = &ts3_arg;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ts3_type, args) == FFI_OK);
|
||||||
|
|
||||||
|
ts3_arg.si = -123;
|
||||||
|
compare_value = ts3_arg.si;
|
||||||
|
|
||||||
|
ffi_call(&cif, FFI_FN(struct3), ts3_result, values);
|
||||||
|
|
||||||
|
printf ("%d %d\n", ts3_result->si, -(compare_value*2));
|
||||||
|
|
||||||
|
if (ts3_result->si == -(ts3_arg.si*2))
|
||||||
|
puts ("structure test 3 ok!");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
puts ("Structure test 3 found structure passing bug.");
|
||||||
|
puts (" Current versions of GCC are not 100% compliant with the");
|
||||||
|
puts (" n32 ABI. There is a known problem related to passing");
|
||||||
|
puts (" small structures. Send a bug report to the gcc maintainers.");
|
||||||
|
}
|
||||||
|
|
||||||
|
free (ts3_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct tests */
|
||||||
|
{
|
||||||
|
test_structure_4 ts4_arg;
|
||||||
|
|
||||||
|
/* This is a hack to get a properly aligned result buffer */
|
||||||
|
test_structure_4 *ts4_result =
|
||||||
|
(test_structure_4 *) malloc (sizeof(test_structure_4));
|
||||||
|
|
||||||
|
args[0] = &ts4_type;
|
||||||
|
values[0] = &ts4_arg;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
|
||||||
|
&ts4_type, args) == FFI_OK);
|
||||||
|
|
||||||
|
ts4_arg.ui1 = 2;
|
||||||
|
ts4_arg.ui2 = 3;
|
||||||
|
ts4_arg.ui3 = 4;
|
||||||
|
|
||||||
|
ffi_call (&cif, FFI_FN(struct4), ts4_result, values);
|
||||||
|
|
||||||
|
if (ts4_result->ui3 == 2U * 3U * 4U)
|
||||||
|
puts ("structure test 4 ok!");
|
||||||
|
else
|
||||||
|
puts ("Structure test 4 found GCC's structure passing bug.");
|
||||||
|
|
||||||
|
free (ts4_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct tests */
|
||||||
|
{
|
||||||
|
test_structure_5 ts5_arg1, ts5_arg2;
|
||||||
|
|
||||||
|
/* This is a hack to get a properly aligned result buffer */
|
||||||
|
test_structure_5 *ts5_result =
|
||||||
|
(test_structure_5 *) malloc (sizeof(test_structure_5));
|
||||||
|
|
||||||
|
args[0] = &ts5_type;
|
||||||
|
args[1] = &ts5_type;
|
||||||
|
values[0] = &ts5_arg1;
|
||||||
|
values[1] = &ts5_arg2;
|
||||||
|
|
||||||
|
/* Initialize the cif */
|
||||||
|
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
|
||||||
|
&ts5_type, args) == FFI_OK);
|
||||||
|
|
||||||
|
ts5_arg1.c1 = 2;
|
||||||
|
ts5_arg1.c2 = 6;
|
||||||
|
ts5_arg2.c1 = 5;
|
||||||
|
ts5_arg2.c2 = 3;
|
||||||
|
|
||||||
|
ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
|
||||||
|
|
||||||
|
if (ts5_result->c1 == 7
|
||||||
|
&& ts5_result->c2 == 3)
|
||||||
|
puts ("structure test 5 ok!");
|
||||||
|
else
|
||||||
|
puts ("Structure test 5 found GCC's structure passing bug.");
|
||||||
|
|
||||||
|
free (ts5_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we arrived here, all is good */
|
||||||
|
(void) puts("\nLooks good. No surprises.\n");
|
||||||
|
|
||||||
|
/*@-compdestroy@*/
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
184
libffi/src/m68k/ffi.c
Normal file
184
libffi/src/m68k/ffi.c
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c
|
||||||
|
|
||||||
|
m68k Foreign Function Interface
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space has
|
||||||
|
been allocated for the function's arguments. */
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ffi_prep_args (void *stack, extended_cif *ecif)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
int tmp;
|
||||||
|
unsigned int avn;
|
||||||
|
void **p_argv;
|
||||||
|
char *argp;
|
||||||
|
ffi_type **p_arg;
|
||||||
|
void *struct_value_ptr;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
|
argp = stack;
|
||||||
|
|
||||||
|
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
|
||||||
|
&& ecif->cif->rtype->size > 8)
|
||||||
|
struct_value_ptr = ecif->rvalue;
|
||||||
|
else
|
||||||
|
struct_value_ptr = NULL;
|
||||||
|
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
|
||||||
|
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
||||||
|
i != 0 && avn != 0;
|
||||||
|
i--, p_arg++)
|
||||||
|
{
|
||||||
|
size_t z;
|
||||||
|
|
||||||
|
/* Align if necessary. */
|
||||||
|
if (((*p_arg)->alignment - 1) & (unsigned) argp)
|
||||||
|
argp = (char *) ALIGN (argp, (*p_arg)->alignment);
|
||||||
|
|
||||||
|
if (avn != 0)
|
||||||
|
{
|
||||||
|
avn--;
|
||||||
|
z = (*p_arg)->size;
|
||||||
|
if (z < sizeof (int))
|
||||||
|
{
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
memcpy (argp + sizeof (int) - z, *p_argv, z);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT (0);
|
||||||
|
}
|
||||||
|
z = sizeof (int);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
memcpy (argp, *p_argv, z);
|
||||||
|
p_argv++;
|
||||||
|
argp += z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return struct_value_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CIF_FLAGS_INT 1
|
||||||
|
#define CIF_FLAGS_DINT 2
|
||||||
|
#define CIF_FLAGS_FLOAT 4
|
||||||
|
#define CIF_FLAGS_DOUBLE 8
|
||||||
|
#define CIF_FLAGS_LDOUBLE 16
|
||||||
|
#define CIF_FLAGS_POINTER 32
|
||||||
|
#define CIF_FLAGS_STRUCT 64
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status
|
||||||
|
ffi_prep_cif_machdep (ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
cif->flags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
if (cif->rtype->size > 4 && cif->rtype->size <= 8)
|
||||||
|
cif->flags = CIF_FLAGS_DINT;
|
||||||
|
else if (cif->rtype->size <= 4)
|
||||||
|
cif->flags = CIF_FLAGS_STRUCT;
|
||||||
|
else
|
||||||
|
cif->flags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
cif->flags = CIF_FLAGS_FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags = CIF_FLAGS_DOUBLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
cif->flags = CIF_FLAGS_LDOUBLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_POINTER:
|
||||||
|
cif->flags = CIF_FLAGS_POINTER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
cif->flags = CIF_FLAGS_DINT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags = CIF_FLAGS_INT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void ffi_call_SYSV (void *(*) (void *, extended_cif *),
|
||||||
|
extended_cif *,
|
||||||
|
unsigned, unsigned, unsigned,
|
||||||
|
void *, void (*fn) ());
|
||||||
|
|
||||||
|
void
|
||||||
|
ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return value
|
||||||
|
address then we need to make one. */
|
||||||
|
|
||||||
|
if (rvalue == NULL
|
||||||
|
&& cif->rtype->type == FFI_TYPE_STRUCT
|
||||||
|
&& cif->rtype->size > 8)
|
||||||
|
ecif.rvalue = alloca (cif->rtype->size);
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_SYSV:
|
||||||
|
ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, cif->rtype->size * 8,
|
||||||
|
ecif.rvalue, fn);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT (0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
96
libffi/src/m68k/sysv.S
Normal file
96
libffi/src/m68k/sysv.S
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
sysv.S
|
||||||
|
|
||||||
|
m68k Foreign Function Interface
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
.globl ffi_call_SYSV
|
||||||
|
.type ffi_call_SYSV,@function
|
||||||
|
|
||||||
|
ffi_call_SYSV:
|
||||||
|
link %fp,#0
|
||||||
|
move.l %d2,-(%sp)
|
||||||
|
|
||||||
|
| Make room for all of the new args.
|
||||||
|
sub.l 16(%fp),%sp
|
||||||
|
|
||||||
|
| Call ffi_prep_args
|
||||||
|
move.l 12(%fp),-(%sp)
|
||||||
|
pea 4(%sp)
|
||||||
|
move.l 8(%fp),%a0
|
||||||
|
jsr (%a0)
|
||||||
|
addq.l #8,%sp
|
||||||
|
|
||||||
|
| Pass pointer to struct value, if any
|
||||||
|
move.l %a0,%a1
|
||||||
|
|
||||||
|
| Call the function
|
||||||
|
move.l 32(%fp),%a0
|
||||||
|
jsr (%a0)
|
||||||
|
|
||||||
|
| Remove the space we pushed for the args
|
||||||
|
add.l 16(%fp),%sp
|
||||||
|
|
||||||
|
| Load the pointer to storage for the return value
|
||||||
|
move.l 28(%fp),%a1
|
||||||
|
|
||||||
|
| Load the return type code
|
||||||
|
move.l 20(%fp),%d2
|
||||||
|
|
||||||
|
| If the return value pointer is NULL, assume no return value.
|
||||||
|
tst.l %a1
|
||||||
|
jbeq noretval
|
||||||
|
|
||||||
|
btst #0,%d2
|
||||||
|
jbeq retlongint
|
||||||
|
move.l %d0,(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retlongint:
|
||||||
|
btst #1,%d2
|
||||||
|
jbeq retfloat
|
||||||
|
move.l %d0,(%a1)
|
||||||
|
move.l %d1,4(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retfloat:
|
||||||
|
btst #2,%d2
|
||||||
|
jbeq retdouble
|
||||||
|
fmove.s %fp0,(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retdouble:
|
||||||
|
btst #3,%d2
|
||||||
|
jbeq retlongdouble
|
||||||
|
fmove.d %fp0,(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retlongdouble:
|
||||||
|
btst #4,%d2
|
||||||
|
jbeq retpointer
|
||||||
|
fmove.x %fp0,(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retpointer:
|
||||||
|
btst #5,%d2
|
||||||
|
jbeq retstruct
|
||||||
|
move.l %a0,(%a1)
|
||||||
|
jbra epilogue
|
||||||
|
|
||||||
|
retstruct:
|
||||||
|
btst #6,%d2
|
||||||
|
jbeq noretval
|
||||||
|
move.l 24(%fp),%d2
|
||||||
|
bfins %d0,(%a1){#0,%d2}
|
||||||
|
|
||||||
|
noretval:
|
||||||
|
epilogue:
|
||||||
|
move.l (%sp)+,%d2
|
||||||
|
unlk %a6
|
||||||
|
rts
|
||||||
|
.size ffi_call_SYSV,.-ffi_call_SYSV
|
||||||
471
libffi/src/mips/ffi.c
Normal file
471
libffi/src/mips/ffi.c
Normal file
@@ -0,0 +1,471 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1996 Cygnus Solutions
|
||||||
|
|
||||||
|
MIPS Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
#define FIX_ARGP \
|
||||||
|
FFI_ASSERT(argp <= &stack[bytes]); \
|
||||||
|
if (argp == &stack[bytes]) \
|
||||||
|
{ \
|
||||||
|
argp = stack; \
|
||||||
|
ffi_stop_here(); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define FIX_ARGP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments */
|
||||||
|
|
||||||
|
static void ffi_prep_args(char *stack,
|
||||||
|
extended_cif *ecif,
|
||||||
|
int bytes,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
register int avn;
|
||||||
|
register void **p_argv;
|
||||||
|
register char *argp;
|
||||||
|
register ffi_type **p_arg;
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
/* If more than 8 double words are used, the remainder go
|
||||||
|
on the stack. We reorder stuff on the stack here to
|
||||||
|
support this easily. */
|
||||||
|
if (bytes > 8 * SIZEOF_ARG)
|
||||||
|
argp = &stack[bytes - (8 * SIZEOF_ARG)];
|
||||||
|
else
|
||||||
|
argp = stack;
|
||||||
|
#else
|
||||||
|
argp = stack;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(stack, 0, bytes);
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
if ( ecif->cif->rstruct_flag != 0 )
|
||||||
|
#else
|
||||||
|
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
*(SLOT_TYPE_UNSIGNED *) argp = (SLOT_TYPE_UNSIGNED) ecif->rvalue;
|
||||||
|
argp += sizeof(SLOT_TYPE_UNSIGNED);
|
||||||
|
FIX_ARGP;
|
||||||
|
}
|
||||||
|
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
|
||||||
|
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
||||||
|
i && avn;
|
||||||
|
i--, p_arg++)
|
||||||
|
{
|
||||||
|
size_t z;
|
||||||
|
|
||||||
|
/* Align if necessary */
|
||||||
|
if (((*p_arg)->alignment - 1) & (unsigned) argp) {
|
||||||
|
argp = (char *) ALIGN(argp, (*p_arg)->alignment);
|
||||||
|
FIX_ARGP;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||||
|
#define OFFSET 0
|
||||||
|
#else
|
||||||
|
#define OFFSET sizeof(int)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (avn)
|
||||||
|
{
|
||||||
|
avn--;
|
||||||
|
z = (*p_arg)->size;
|
||||||
|
if (z < sizeof(SLOT_TYPE_UNSIGNED))
|
||||||
|
{
|
||||||
|
z = sizeof(SLOT_TYPE_UNSIGNED);
|
||||||
|
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(SINT32 *) &argp[OFFSET] = (SINT32)*(SINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(UINT32 *) &argp[OFFSET] = (UINT32)*(UINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(SINT32 *) &argp[OFFSET] = (SINT32)*(SINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(UINT32 *) &argp[OFFSET] = (UINT32)*(UINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
*(SINT32 *) &argp[OFFSET] = (SINT32)*(SINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
case FFI_TYPE_POINTER:
|
||||||
|
*(UINT32 *) &argp[OFFSET] = (UINT32)*(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* This can only happen with 64bit slots */
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
*(float *) argp = *(float *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Handle small structures */
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
memcpy(argp, *p_argv, (*p_arg)->size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||||
|
memcpy(argp, *p_argv, z);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
unsigned end = (unsigned) argp+z;
|
||||||
|
unsigned cap = (unsigned) stack+bytes;
|
||||||
|
|
||||||
|
/* Check if the data will fit within the register
|
||||||
|
space. Handle it if it doesn't. */
|
||||||
|
|
||||||
|
if (end <= cap)
|
||||||
|
memcpy(argp, *p_argv, z);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned portion = end - cap;
|
||||||
|
|
||||||
|
memcpy(argp, *p_argv, portion);
|
||||||
|
argp = stack;
|
||||||
|
memcpy(argp,
|
||||||
|
(void*)((unsigned)(*p_argv)+portion), z - portion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
p_argv++;
|
||||||
|
argp += z;
|
||||||
|
FIX_ARGP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
|
||||||
|
/* The n32 spec says that if "a chunk consists solely of a double
|
||||||
|
float field (but not a double, which is part of a union), it
|
||||||
|
is passed in a floating point register. Any other chunk is
|
||||||
|
passed in an integer register". This code traverses structure
|
||||||
|
definitions and generates the appropriate flags. */
|
||||||
|
|
||||||
|
unsigned calc_n32_struct_flags(ffi_type *arg, unsigned *shift)
|
||||||
|
{
|
||||||
|
unsigned flags = 0;
|
||||||
|
unsigned index = 0;
|
||||||
|
|
||||||
|
ffi_type *e;
|
||||||
|
|
||||||
|
while (e = arg->elements[index])
|
||||||
|
{
|
||||||
|
if (e->type == FFI_TYPE_DOUBLE)
|
||||||
|
{
|
||||||
|
flags += (FFI_TYPE_DOUBLE << *shift);
|
||||||
|
*shift += FFI_FLAG_BITS;
|
||||||
|
}
|
||||||
|
else if (e->type == FFI_TYPE_STRUCT)
|
||||||
|
flags += calc_n32_struct_flags(e, shift);
|
||||||
|
else
|
||||||
|
*shift += FFI_FLAG_BITS;
|
||||||
|
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned calc_n32_return_struct_flags(ffi_type *arg)
|
||||||
|
{
|
||||||
|
unsigned flags = 0;
|
||||||
|
unsigned index = 0;
|
||||||
|
unsigned small = FFI_TYPE_SMALLSTRUCT;
|
||||||
|
ffi_type *e;
|
||||||
|
|
||||||
|
/* Returning structures under n32 is a tricky thing.
|
||||||
|
A struct with only one or two floating point fields
|
||||||
|
is returned in $f0 (and $f2 if necessary). Any other
|
||||||
|
struct results at most 128 bits are returned in $2
|
||||||
|
(the first 64 bits) and $3 (remainder, if necessary).
|
||||||
|
Larger structs are handled normally. */
|
||||||
|
|
||||||
|
if (arg->size > 16)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (arg->size > 8)
|
||||||
|
small = FFI_TYPE_SMALLSTRUCT2;
|
||||||
|
|
||||||
|
e = arg->elements[0];
|
||||||
|
if (e->type == FFI_TYPE_DOUBLE)
|
||||||
|
flags = FFI_TYPE_DOUBLE << FFI_FLAG_BITS;
|
||||||
|
else if (e->type == FFI_TYPE_FLOAT)
|
||||||
|
flags = FFI_TYPE_FLOAT << FFI_FLAG_BITS;
|
||||||
|
|
||||||
|
if (flags && (e = arg->elements[1]))
|
||||||
|
{
|
||||||
|
if (e->type == FFI_TYPE_DOUBLE)
|
||||||
|
flags += FFI_TYPE_DOUBLE;
|
||||||
|
else if (e->type == FFI_TYPE_FLOAT)
|
||||||
|
flags += FFI_TYPE_FLOAT;
|
||||||
|
else
|
||||||
|
return small;
|
||||||
|
|
||||||
|
if (flags && (arg->elements[2]))
|
||||||
|
{
|
||||||
|
/* There are three arguments and the first two are
|
||||||
|
floats! This must be passed the old way. */
|
||||||
|
return small;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (!flags)
|
||||||
|
return small;
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
cif->flags = 0;
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||||
|
/* Set the flags necessary for O32 processing */
|
||||||
|
|
||||||
|
if (cif->rtype->type != FFI_TYPE_STRUCT)
|
||||||
|
{
|
||||||
|
if (cif->nargs > 0)
|
||||||
|
{
|
||||||
|
switch ((cif->arg_types)[0]->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags += (cif->arg_types)[0]->type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cif->nargs > 1)
|
||||||
|
{
|
||||||
|
/* Only handle the second argument if the first
|
||||||
|
is a float or double. */
|
||||||
|
if (cif->flags)
|
||||||
|
{
|
||||||
|
switch ((cif->arg_types)[1]->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
/* Set the flags necessary for N32 processing */
|
||||||
|
{
|
||||||
|
unsigned shift = 0;
|
||||||
|
unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
|
||||||
|
unsigned index = 0;
|
||||||
|
|
||||||
|
unsigned struct_flags = 0;
|
||||||
|
|
||||||
|
if (cif->rtype->type == FFI_TYPE_STRUCT)
|
||||||
|
{
|
||||||
|
struct_flags = calc_n32_return_struct_flags(cif->rtype);
|
||||||
|
|
||||||
|
if (struct_flags == 0)
|
||||||
|
{
|
||||||
|
/* This means that the structure is being passed as
|
||||||
|
a hidden argument */
|
||||||
|
|
||||||
|
shift = FFI_FLAG_BITS;
|
||||||
|
count = (cif->nargs < 7) ? cif->nargs : 7;
|
||||||
|
|
||||||
|
cif->rstruct_flag = !0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cif->rstruct_flag = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cif->rstruct_flag = 0;
|
||||||
|
|
||||||
|
while (count-- > 0)
|
||||||
|
{
|
||||||
|
switch ((cif->arg_types)[index]->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags += ((cif->arg_types)[index]->type << shift);
|
||||||
|
shift += FFI_FLAG_BITS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
cif->flags += calc_n32_struct_flags((cif->arg_types)[index],
|
||||||
|
&shift);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
shift += FFI_FLAG_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
{
|
||||||
|
if (struct_flags == 0)
|
||||||
|
{
|
||||||
|
/* The structure is returned through a hidden
|
||||||
|
first argument. Do nothing, 'cause FFI_TYPE_VOID
|
||||||
|
is 0 */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The structure is returned via some tricky
|
||||||
|
mechanism */
|
||||||
|
cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
|
||||||
|
cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
/* Do nothing, 'cause FFI_TYPE_VOID is 0 */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Low level routine for calling O32 functions */
|
||||||
|
extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int),
|
||||||
|
extended_cif *, unsigned,
|
||||||
|
unsigned, unsigned *, void (*)());
|
||||||
|
|
||||||
|
/* Low level routine for calling N32 functions */
|
||||||
|
extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int),
|
||||||
|
extended_cif *, unsigned,
|
||||||
|
unsigned, unsigned *, void (*)());
|
||||||
|
|
||||||
|
void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return */
|
||||||
|
/* value address then we need to make one */
|
||||||
|
|
||||||
|
if ((rvalue == NULL) &&
|
||||||
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||||
|
case FFI_O32:
|
||||||
|
ffi_call_O32(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, ecif.rvalue, fn);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
case FFI_N32:
|
||||||
|
ffi_call_N32(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, ecif.rvalue, fn);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
320
libffi/src/mips/n32.S
Normal file
320
libffi/src/mips/n32.S
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
n32.S - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
MIPS Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: n32.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
/* Only build this code if we are compiling for n32 */
|
||||||
|
|
||||||
|
#if defined(FFI_MIPS_N32)
|
||||||
|
|
||||||
|
#define callback a0
|
||||||
|
#define bytes a2
|
||||||
|
#define flags a3
|
||||||
|
#define raddr a4
|
||||||
|
#define fn a5
|
||||||
|
|
||||||
|
#define SIZEOF_FRAME ( 8 * SIZEOF_ARG )
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ffi_call_N32
|
||||||
|
.ent ffi_call_N32
|
||||||
|
ffi_call_N32:
|
||||||
|
|
||||||
|
# Prologue
|
||||||
|
SUBU $sp, SIZEOF_FRAME # Frame size
|
||||||
|
REG_S $fp, SIZEOF_FRAME - 2*SIZEOF_ARG($sp) # Save frame pointer
|
||||||
|
REG_S ra, SIZEOF_FRAME - 1*SIZEOF_ARG($sp) # Save return address
|
||||||
|
move $fp, $sp
|
||||||
|
|
||||||
|
move t9, callback # callback function pointer
|
||||||
|
REG_S bytes, 2*SIZEOF_ARG($fp) # bytes
|
||||||
|
REG_S flags, 3*SIZEOF_ARG($fp) # flags
|
||||||
|
REG_S raddr, 4*SIZEOF_ARG($fp) # raddr
|
||||||
|
REG_S fn, 5*SIZEOF_ARG($fp) # fn
|
||||||
|
|
||||||
|
# Allocate at least 4 words in the argstack
|
||||||
|
move v0, bytes
|
||||||
|
bge bytes, 4 * SIZEOF_ARG, bigger
|
||||||
|
LI v0, 4 * SIZEOF_ARG
|
||||||
|
b sixteen
|
||||||
|
|
||||||
|
bigger:
|
||||||
|
ADDU t4, v0, 2 * SIZEOF_ARG -1 # make sure it is aligned
|
||||||
|
and v0, t4, -2 * SIZEOF_ARG # to a proper boundry.
|
||||||
|
|
||||||
|
sixteen:
|
||||||
|
SUBU $sp, $sp, v0 # move the stack pointer to reflect the
|
||||||
|
# arg space
|
||||||
|
|
||||||
|
ADDU a0, $sp, 0 # 4 * SIZEOF_ARG
|
||||||
|
ADDU a3, $fp, 3 * SIZEOF_ARG
|
||||||
|
|
||||||
|
# Call ffi_prep_args
|
||||||
|
jal t9
|
||||||
|
|
||||||
|
# ADDU $sp, $sp, 4 * SIZEOF_ARG # adjust $sp to new args
|
||||||
|
|
||||||
|
# Copy the stack pointer to t9
|
||||||
|
move t9, $sp
|
||||||
|
|
||||||
|
# Fix the stack if there are more than 8 64bit slots worth
|
||||||
|
# of arguments.
|
||||||
|
|
||||||
|
# Load the number of bytes
|
||||||
|
REG_L t6, 2*SIZEOF_ARG($fp)
|
||||||
|
|
||||||
|
# Is it bigger than 8 * SIZEOF_ARG?
|
||||||
|
dadd t7, $0, 8 * SIZEOF_ARG
|
||||||
|
dsub t8, t6, t7
|
||||||
|
bltz t8, loadregs
|
||||||
|
|
||||||
|
add t9, t9, t8
|
||||||
|
|
||||||
|
loadregs:
|
||||||
|
|
||||||
|
REG_L t4, 3*SIZEOF_ARG($fp) # load the flags word
|
||||||
|
add t6, t4, 0 # and copy it into t6
|
||||||
|
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg1_floatp
|
||||||
|
REG_L a0, 0*SIZEOF_ARG(t9)
|
||||||
|
b arg1_next
|
||||||
|
arg1_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg1_doublep
|
||||||
|
l.s $f12, 0*SIZEOF_ARG(t9)
|
||||||
|
b arg1_next
|
||||||
|
arg1_doublep:
|
||||||
|
l.d $f12, 0*SIZEOF_ARG(t9)
|
||||||
|
arg1_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 1*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg2_floatp
|
||||||
|
REG_L a1, 1*SIZEOF_ARG(t9)
|
||||||
|
b arg2_next
|
||||||
|
arg2_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg2_doublep
|
||||||
|
l.s $f13, 1*SIZEOF_ARG(t9)
|
||||||
|
b arg2_next
|
||||||
|
arg2_doublep:
|
||||||
|
l.d $f13, 1*SIZEOF_ARG(t9)
|
||||||
|
arg2_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 2*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg3_floatp
|
||||||
|
REG_L a2, 2*SIZEOF_ARG(t9)
|
||||||
|
b arg3_next
|
||||||
|
arg3_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg3_doublep
|
||||||
|
l.s $f14, 2*SIZEOF_ARG(t9)
|
||||||
|
b arg3_next
|
||||||
|
arg3_doublep:
|
||||||
|
l.d $f14, 2*SIZEOF_ARG(t9)
|
||||||
|
arg3_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 3*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg4_floatp
|
||||||
|
REG_L a3, 3*SIZEOF_ARG(t9)
|
||||||
|
b arg4_next
|
||||||
|
arg4_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg4_doublep
|
||||||
|
l.s $f15, 3*SIZEOF_ARG(t9)
|
||||||
|
b arg4_next
|
||||||
|
arg4_doublep:
|
||||||
|
l.d $f15, 3*SIZEOF_ARG(t9)
|
||||||
|
arg4_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 4*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg5_floatp
|
||||||
|
REG_L a4, 4*SIZEOF_ARG(t9)
|
||||||
|
b arg5_next
|
||||||
|
arg5_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg5_doublep
|
||||||
|
l.s $f16, 4*SIZEOF_ARG(t9)
|
||||||
|
b arg5_next
|
||||||
|
arg5_doublep:
|
||||||
|
l.d $f16, 4*SIZEOF_ARG(t9)
|
||||||
|
arg5_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 5*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg6_floatp
|
||||||
|
REG_L a5, 5*SIZEOF_ARG(t9)
|
||||||
|
b arg6_next
|
||||||
|
arg6_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg6_doublep
|
||||||
|
l.s $f17, 5*SIZEOF_ARG(t9)
|
||||||
|
b arg6_next
|
||||||
|
arg6_doublep:
|
||||||
|
l.d $f17, 5*SIZEOF_ARG(t9)
|
||||||
|
arg6_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 6*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg7_floatp
|
||||||
|
REG_L a6, 6*SIZEOF_ARG(t9)
|
||||||
|
b arg7_next
|
||||||
|
arg7_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg7_doublep
|
||||||
|
l.s $f18, 6*SIZEOF_ARG(t9)
|
||||||
|
b arg7_next
|
||||||
|
arg7_doublep:
|
||||||
|
l.d $f18, 6*SIZEOF_ARG(t9)
|
||||||
|
arg7_next:
|
||||||
|
|
||||||
|
add t4, t6, 0
|
||||||
|
SRL t4, 7*FFI_FLAG_BITS
|
||||||
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
||||||
|
bnez t4, arg8_floatp
|
||||||
|
REG_L a7, 7*SIZEOF_ARG(t9)
|
||||||
|
b arg8_next
|
||||||
|
arg8_floatp:
|
||||||
|
bne t4, FFI_TYPE_FLOAT, arg8_doublep
|
||||||
|
l.s $f19, 7*SIZEOF_ARG(t9)
|
||||||
|
b arg8_next
|
||||||
|
arg8_doublep:
|
||||||
|
l.d $f19, 7*SIZEOF_ARG(t9)
|
||||||
|
arg8_next:
|
||||||
|
|
||||||
|
callit:
|
||||||
|
# Load the function pointer
|
||||||
|
REG_L t9, 5*SIZEOF_ARG($fp)
|
||||||
|
|
||||||
|
# If the return value pointer is NULL, assume no return value.
|
||||||
|
REG_L t5, 4*SIZEOF_ARG($fp)
|
||||||
|
beqz t5, noretval
|
||||||
|
|
||||||
|
# Shift the return type flag over
|
||||||
|
SRL t6, 8*FFI_FLAG_BITS
|
||||||
|
|
||||||
|
bne t6, FFI_TYPE_INT, retfloat
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
REG_S v0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retfloat:
|
||||||
|
bne t6, FFI_TYPE_FLOAT, retdouble
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.s $f0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retdouble:
|
||||||
|
bne t6, FFI_TYPE_DOUBLE, retstruct_d
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.d $f0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_d:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_D, retstruct_f
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.d $f0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_f:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_F, retstruct_d_d
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.s $f0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_d_d:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.d $f0, 0(t4)
|
||||||
|
s.d $f2, 8(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_f_f:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.s $f0, 0(t4)
|
||||||
|
s.s $f2, 4(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_d_f:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_DF, retstruct_f_d
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.d $f0, 0(t4)
|
||||||
|
s.s $f2, 8(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_f_d:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_FD, retstruct_small
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
s.s $f0, 0(t4)
|
||||||
|
s.d $f2, 8(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_small:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
REG_S v0, 0(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct_small2:
|
||||||
|
bne t6, FFI_TYPE_STRUCT_SMALL2, retstruct
|
||||||
|
jal t9
|
||||||
|
REG_L t4, 4*SIZEOF_ARG($fp)
|
||||||
|
REG_S v0, 0(t4)
|
||||||
|
REG_S v1, 8(t4)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retstruct:
|
||||||
|
noretval:
|
||||||
|
jal t9
|
||||||
|
|
||||||
|
# Epilogue
|
||||||
|
epilogue:
|
||||||
|
move $sp, $fp
|
||||||
|
REG_L $fp, SIZEOF_FRAME - 2*SIZEOF_ARG($sp) # Restore frame pointer
|
||||||
|
REG_L ra, SIZEOF_FRAME - 1*SIZEOF_ARG($sp) # Restore return address
|
||||||
|
ADDU $sp, SIZEOF_FRAME # Fix stack pointer
|
||||||
|
j ra
|
||||||
|
|
||||||
|
.end ffi_call_N32
|
||||||
|
|
||||||
|
#endif
|
||||||
14
libffi/src/mips/n32.s
Normal file
14
libffi/src/mips/n32.s
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include "n32.S"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
173
libffi/src/mips/o32.S
Normal file
173
libffi/src/mips/o32.S
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
o32.S - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
MIPS Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: o32.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
/* Only build this code if we are compiling for o32 */
|
||||||
|
|
||||||
|
#if defined(FFI_MIPS_O32)
|
||||||
|
|
||||||
|
#define callback a0
|
||||||
|
#define bytes a2
|
||||||
|
#define flags a3
|
||||||
|
|
||||||
|
#define SIZEOF_FRAME ( 4 * SIZEOF_ARG + 2 * SIZEOF_ARG )
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 2
|
||||||
|
.globl ffi_call_O32
|
||||||
|
.ent ffi_call_O32
|
||||||
|
ffi_call_O32:
|
||||||
|
|
||||||
|
# Prologue
|
||||||
|
SUBU $sp, SIZEOF_FRAME # Frame size
|
||||||
|
REG_S $fp, SIZEOF_FRAME - 2*SIZEOF_ARG($sp) # Save frame pointer
|
||||||
|
REG_S ra, SIZEOF_FRAME - 1*SIZEOF_ARG($sp) # Save return address
|
||||||
|
move $fp, $sp
|
||||||
|
|
||||||
|
move t9, callback # callback function pointer
|
||||||
|
REG_S flags, SIZEOF_FRAME + 3*SIZEOF_ARG($fp) # flags
|
||||||
|
|
||||||
|
# Allocate at least 4 words in the argstack
|
||||||
|
move v0, bytes
|
||||||
|
bge bytes, 4 * SIZEOF_ARG, bigger
|
||||||
|
LI v0, 4 * SIZEOF_ARG
|
||||||
|
b sixteen
|
||||||
|
|
||||||
|
bigger:
|
||||||
|
ADDU t0, v0, 2 * SIZEOF_ARG -1 # make sure it is aligned
|
||||||
|
and v0, t0, -2 * SIZEOF_ARG # to an 8 byte boundry
|
||||||
|
|
||||||
|
sixteen:
|
||||||
|
SUBU $sp, $sp, v0 # move the stack pointer to reflect the
|
||||||
|
# arg space
|
||||||
|
|
||||||
|
ADDU a0, $sp, 4 * SIZEOF_ARG
|
||||||
|
ADDU a3, $fp, SIZEOF_FRAME + 3*SIZEOF_ARG
|
||||||
|
|
||||||
|
jal t9
|
||||||
|
|
||||||
|
REG_L t0, SIZEOF_FRAME + 3*SIZEOF_ARG($fp) # load the flags word
|
||||||
|
add t2, t0, 0 # and copy it into t2
|
||||||
|
|
||||||
|
and t0, ((1<<4)-1) # mask out the return type
|
||||||
|
SRL t2, 4 # shift our arg info
|
||||||
|
|
||||||
|
ADDU $sp, $sp, 4 * SIZEOF_ARG # adjust $sp to new args
|
||||||
|
|
||||||
|
bnez t0, pass_d # make it quick for int
|
||||||
|
REG_L a0, 0*SIZEOF_ARG($sp) # just go ahead and load the
|
||||||
|
REG_L a1, 1*SIZEOF_ARG($sp) # four regs.
|
||||||
|
REG_L a2, 2*SIZEOF_ARG($sp)
|
||||||
|
REG_L a3, 3*SIZEOF_ARG($sp)
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_d:
|
||||||
|
bne t0, FFI_ARGS_D, pass_f
|
||||||
|
l.d $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
REG_L a2, 2*SIZEOF_ARG($sp) # passing a double
|
||||||
|
REG_L a3, 3*SIZEOF_ARG($sp)
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_f:
|
||||||
|
bne t0, FFI_ARGS_F, pass_d_d
|
||||||
|
l.s $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
REG_L a1, 1*SIZEOF_ARG($sp) # passing a float
|
||||||
|
REG_L a2, 2*SIZEOF_ARG($sp)
|
||||||
|
REG_L a3, 3*SIZEOF_ARG($sp)
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_d_d:
|
||||||
|
bne t0, FFI_ARGS_DD, pass_f_f
|
||||||
|
l.d $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
l.d $f14, 2*SIZEOF_ARG($sp) # passing two doubles
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_f_f:
|
||||||
|
bne t0, FFI_ARGS_FF, pass_d_f
|
||||||
|
l.s $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
l.s $f14, 1*SIZEOF_ARG($sp) # passing two floats
|
||||||
|
REG_L a2, 2*SIZEOF_ARG($sp)
|
||||||
|
REG_L a3, 3*SIZEOF_ARG($sp)
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_d_f:
|
||||||
|
bne t0, FFI_ARGS_DF, pass_f_d
|
||||||
|
l.d $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
l.s $f14, 2*SIZEOF_ARG($sp) # passing double and float
|
||||||
|
REG_L a3, 3*SIZEOF_ARG($sp)
|
||||||
|
b call_it
|
||||||
|
|
||||||
|
pass_f_d:
|
||||||
|
# assume that the only other combination must be float then double
|
||||||
|
# bne t0, FFI_ARGS_F_D, call_it
|
||||||
|
l.s $f12, 0*SIZEOF_ARG($sp) # load $fp regs from args
|
||||||
|
l.d $f14, 2*SIZEOF_ARG($sp) # passing double and float
|
||||||
|
|
||||||
|
call_it:
|
||||||
|
# Load the function pointer
|
||||||
|
REG_L t9, SIZEOF_FRAME + 5*SIZEOF_ARG($fp)
|
||||||
|
|
||||||
|
# If the return value pointer is NULL, assume no return value.
|
||||||
|
REG_L t1, SIZEOF_FRAME + 4*SIZEOF_ARG($fp)
|
||||||
|
beqz t1, noretval
|
||||||
|
|
||||||
|
bne t2, FFI_TYPE_INT, retfloat
|
||||||
|
jal t9
|
||||||
|
REG_L t0, SIZEOF_FRAME + 4*SIZEOF_ARG($fp)
|
||||||
|
REG_S v0, 0(t0)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retfloat:
|
||||||
|
bne t2, FFI_TYPE_FLOAT, retdouble
|
||||||
|
jal t9
|
||||||
|
REG_L t0, SIZEOF_FRAME + 4*SIZEOF_ARG($fp)
|
||||||
|
s.s $f0, 0(t0)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
retdouble:
|
||||||
|
bne t2, FFI_TYPE_DOUBLE, noretval
|
||||||
|
jal t9
|
||||||
|
REG_L t0, SIZEOF_FRAME + 4*SIZEOF_ARG($fp)
|
||||||
|
s.d $f0, 0(t0)
|
||||||
|
b epilogue
|
||||||
|
|
||||||
|
noretval:
|
||||||
|
jal t9
|
||||||
|
|
||||||
|
# Epilogue
|
||||||
|
epilogue:
|
||||||
|
move $sp, $fp
|
||||||
|
REG_L $fp, SIZEOF_FRAME - 2*SIZEOF_ARG($sp) # Restore frame pointer
|
||||||
|
REG_L ra, SIZEOF_FRAME - 1*SIZEOF_ARG($sp) # Restore return address
|
||||||
|
ADDU $sp, SIZEOF_FRAME # Fix stack pointer
|
||||||
|
j ra
|
||||||
|
|
||||||
|
.end ffi_call_O32
|
||||||
|
|
||||||
|
#endif
|
||||||
2
libffi/src/mips/o32.s
Normal file
2
libffi/src/mips/o32.s
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include "o32.S"
|
||||||
|
|
||||||
128
libffi/src/powerpc/asm.h
Normal file
128
libffi/src/powerpc/asm.h
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
asm.h - Copyright (c) 1998 Geoffrey Keating
|
||||||
|
|
||||||
|
PowerPC Assembly glue.
|
||||||
|
|
||||||
|
$Id: asm.h,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define ASM_GLOBAL_DIRECTIVE .globl
|
||||||
|
|
||||||
|
|
||||||
|
#define C_SYMBOL_NAME(name) name
|
||||||
|
/* Macro for a label. */
|
||||||
|
#ifdef __STDC__
|
||||||
|
#define C_LABEL(name) name##:
|
||||||
|
#else
|
||||||
|
#define C_LABEL(name) name/**/:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This seems to always be the case on PPC. */
|
||||||
|
#define ALIGNARG(log2) log2
|
||||||
|
/* For ELF we need the `.type' directive to make shared libs work right. */
|
||||||
|
#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
|
||||||
|
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
|
||||||
|
|
||||||
|
/* If compiled for profiling, call `_mcount' at the start of each function. */
|
||||||
|
#ifdef PROF
|
||||||
|
/* The mcount code relies on a the return address being on the stack
|
||||||
|
to locate our caller and so it can restore it; so store one just
|
||||||
|
for its benefit. */
|
||||||
|
#ifdef PIC
|
||||||
|
#define CALL_MCOUNT \
|
||||||
|
.pushsection; \
|
||||||
|
.section ".data"; \
|
||||||
|
.align ALIGNARG(2); \
|
||||||
|
0:.long 0; \
|
||||||
|
.previous; \
|
||||||
|
mflr %r0; \
|
||||||
|
stw %r0,4(%r1); \
|
||||||
|
bl _GLOBAL_OFFSET_TABLE_@local-4; \
|
||||||
|
mflr %r11; \
|
||||||
|
lwz %r0,0b@got(%r11); \
|
||||||
|
bl JUMPTARGET(_mcount);
|
||||||
|
#else /* PIC */
|
||||||
|
#define CALL_MCOUNT \
|
||||||
|
.section ".data"; \
|
||||||
|
.align ALIGNARG(2); \
|
||||||
|
0:.long 0; \
|
||||||
|
.previous; \
|
||||||
|
mflr %r0; \
|
||||||
|
lis %r11,0b@ha; \
|
||||||
|
stw %r0,4(%r1); \
|
||||||
|
addi %r0,%r11,0b@l; \
|
||||||
|
bl JUMPTARGET(_mcount);
|
||||||
|
#endif /* PIC */
|
||||||
|
#else /* PROF */
|
||||||
|
#define CALL_MCOUNT /* Do nothing. */
|
||||||
|
#endif /* PROF */
|
||||||
|
|
||||||
|
#define ENTRY(name) \
|
||||||
|
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
|
||||||
|
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
|
||||||
|
.align ALIGNARG(2); \
|
||||||
|
C_LABEL(name) \
|
||||||
|
CALL_MCOUNT
|
||||||
|
|
||||||
|
#define EALIGN_W_0 /* No words to insert. */
|
||||||
|
#define EALIGN_W_1 nop
|
||||||
|
#define EALIGN_W_2 nop;nop
|
||||||
|
#define EALIGN_W_3 nop;nop;nop
|
||||||
|
#define EALIGN_W_4 EALIGN_W_3;nop
|
||||||
|
#define EALIGN_W_5 EALIGN_W_4;nop
|
||||||
|
#define EALIGN_W_6 EALIGN_W_5;nop
|
||||||
|
#define EALIGN_W_7 EALIGN_W_6;nop
|
||||||
|
|
||||||
|
/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
|
||||||
|
past a 2^align boundary. */
|
||||||
|
#ifdef PROF
|
||||||
|
#define EALIGN(name, alignt, words) \
|
||||||
|
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
|
||||||
|
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
|
||||||
|
.align ALIGNARG(2); \
|
||||||
|
C_LABEL(name) \
|
||||||
|
CALL_MCOUNT \
|
||||||
|
b 0f; \
|
||||||
|
.align ALIGNARG(alignt); \
|
||||||
|
EALIGN_W_##words; \
|
||||||
|
0:
|
||||||
|
#else /* PROF */
|
||||||
|
#define EALIGN(name, alignt, words) \
|
||||||
|
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
|
||||||
|
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \
|
||||||
|
.align ALIGNARG(alignt); \
|
||||||
|
EALIGN_W_##words; \
|
||||||
|
C_LABEL(name)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define END(name) \
|
||||||
|
ASM_SIZE_DIRECTIVE(name)
|
||||||
|
|
||||||
|
#ifdef PIC
|
||||||
|
#define JUMPTARGET(name) name##@plt
|
||||||
|
#else
|
||||||
|
#define JUMPTARGET(name) name
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Local labels stripped out by the linker. */
|
||||||
|
#define L(x) .L##x
|
||||||
|
|
||||||
423
libffi/src/powerpc/ffi.c
Normal file
423
libffi/src/powerpc/ffi.c
Normal file
@@ -0,0 +1,423 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1998 Geoffrey Keating
|
||||||
|
|
||||||
|
PowerPC Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* The assembly depends on these exact flags. */
|
||||||
|
FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */
|
||||||
|
FLAG_RETURNS_FP = 1 << (31-29),
|
||||||
|
FLAG_RETURNS_64BITS = 1 << (31-28),
|
||||||
|
|
||||||
|
FLAG_ARG_NEEDS_COPY = 1 << (31- 7),
|
||||||
|
FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
|
||||||
|
FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
|
||||||
|
FLAG_RETVAL_REFERENCE = 1 << (31- 4)
|
||||||
|
};
|
||||||
|
|
||||||
|
/* About the SYSV ABI. */
|
||||||
|
enum {
|
||||||
|
NUM_GPR_ARG_REGISTERS = 8,
|
||||||
|
NUM_FPR_ARG_REGISTERS = 8
|
||||||
|
};
|
||||||
|
enum { ASM_NEEDS_REGISTERS = 4 };
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments.
|
||||||
|
|
||||||
|
The stack layout we want looks like this:
|
||||||
|
|
||||||
|
| Return address from ffi_call_SYSV 4bytes | higher addresses
|
||||||
|
|--------------------------------------------|
|
||||||
|
| Previous backchain pointer 4 | stack pointer here
|
||||||
|
|--------------------------------------------|<+ <<< on entry to
|
||||||
|
| Saved r28-r31 4*4 | | ffi_call_SYSV
|
||||||
|
|--------------------------------------------| |
|
||||||
|
| GPR registers r3-r10 8*4 | | ffi_call_SYSV
|
||||||
|
|--------------------------------------------| |
|
||||||
|
| FPR registers f1-f8 (optional) 8*8 | |
|
||||||
|
|--------------------------------------------| | stack |
|
||||||
|
| Space for copied structures | | grows |
|
||||||
|
|--------------------------------------------| | down V
|
||||||
|
| Parameters that didn't fit in registers | |
|
||||||
|
|--------------------------------------------| | lower addresses
|
||||||
|
| Space for callee's LR 4 | |
|
||||||
|
|--------------------------------------------| | stack pointer here
|
||||||
|
| Current backchain pointer 4 |-/ during
|
||||||
|
|--------------------------------------------| <<< ffi_call_SYSV
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*@-exportheader@*/
|
||||||
|
void ffi_prep_args(extended_cif *ecif, unsigned *const stack)
|
||||||
|
/*@=exportheader@*/
|
||||||
|
{
|
||||||
|
const unsigned bytes = ecif->cif->bytes;
|
||||||
|
const unsigned flags = ecif->cif->flags;
|
||||||
|
|
||||||
|
/* 'stacktop' points at the previous backchain pointer. */
|
||||||
|
unsigned *const stacktop = stack + (ecif->cif->bytes / sizeof(unsigned));
|
||||||
|
|
||||||
|
/* 'gpr_base' points at the space for gpr3, and grows upwards as
|
||||||
|
we use GPR registers. */
|
||||||
|
unsigned *gpr_base = stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
|
||||||
|
int intarg_count = 0;
|
||||||
|
|
||||||
|
/* 'fpr_base' points at the space for fpr1, and grows upwards as
|
||||||
|
we use FPR registers. */
|
||||||
|
double *fpr_base = (double *)gpr_base - NUM_FPR_ARG_REGISTERS;
|
||||||
|
int fparg_count = 0;
|
||||||
|
|
||||||
|
/* 'copy_space' grows down as we put structures in it. It should
|
||||||
|
stay 16-byte aligned. */
|
||||||
|
char *copy_space = ((flags & FLAG_FP_ARGUMENTS)
|
||||||
|
? (char *)fpr_base
|
||||||
|
: (char *)gpr_base);
|
||||||
|
|
||||||
|
/* 'next_arg' grows up as we put parameters in it. */
|
||||||
|
unsigned *next_arg = stack + 2;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
ffi_type **ptr;
|
||||||
|
double double_tmp;
|
||||||
|
void **p_argv;
|
||||||
|
size_t struct_copy_size;
|
||||||
|
unsigned gprvalue;
|
||||||
|
|
||||||
|
/* Check that everything starts aligned properly. */
|
||||||
|
FFI_ASSERT(((unsigned)(char *)stack & 0xF) == 0);
|
||||||
|
FFI_ASSERT(((unsigned)(char *)copy_space & 0xF) == 0);
|
||||||
|
FFI_ASSERT(((unsigned)(char *)stacktop & 0xF) == 0);
|
||||||
|
FFI_ASSERT((bytes & 0xF) == 0);
|
||||||
|
FFI_ASSERT(copy_space >= (char *)next_arg);
|
||||||
|
|
||||||
|
/* Deal with return values that are actually pass-by-reference. */
|
||||||
|
if (flags & FLAG_RETVAL_REFERENCE)
|
||||||
|
{
|
||||||
|
*gpr_base++ = (unsigned)(char *)ecif->rvalue;
|
||||||
|
intarg_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now for the arguments. */
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
|
||||||
|
i > 0;
|
||||||
|
i--, ptr++, p_argv++)
|
||||||
|
{
|
||||||
|
switch ((*ptr)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
if ((*ptr)->type == FFI_TYPE_FLOAT)
|
||||||
|
double_tmp = *(float *)*p_argv;
|
||||||
|
else
|
||||||
|
double_tmp = *(double *)*p_argv;
|
||||||
|
|
||||||
|
if (fparg_count >= NUM_FPR_ARG_REGISTERS)
|
||||||
|
{
|
||||||
|
if (intarg_count%2 != 0)
|
||||||
|
{
|
||||||
|
intarg_count++;
|
||||||
|
next_arg++;
|
||||||
|
}
|
||||||
|
*(double *)next_arg = double_tmp;
|
||||||
|
next_arg += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*fpr_base++ = double_tmp;
|
||||||
|
fparg_count++;
|
||||||
|
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
if (intarg_count == NUM_GPR_ARG_REGISTERS-1)
|
||||||
|
intarg_count++;
|
||||||
|
if (intarg_count >= NUM_GPR_ARG_REGISTERS)
|
||||||
|
{
|
||||||
|
if (intarg_count%2 != 0)
|
||||||
|
{
|
||||||
|
intarg_count++;
|
||||||
|
next_arg++;
|
||||||
|
}
|
||||||
|
*(long long *)next_arg = *(long long *)*p_argv;
|
||||||
|
next_arg += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*(long long *)gpr_base = *(long long *)*p_argv;
|
||||||
|
gpr_base += 2;
|
||||||
|
}
|
||||||
|
intarg_count += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
#endif
|
||||||
|
struct_copy_size = ((*ptr)->size + 15) & ~0xF;
|
||||||
|
copy_space -= struct_copy_size;
|
||||||
|
memcpy(copy_space, (char *)*p_argv, (*ptr)->size);
|
||||||
|
|
||||||
|
gprvalue = (unsigned)copy_space;
|
||||||
|
|
||||||
|
FFI_ASSERT(copy_space > (char *)next_arg);
|
||||||
|
FFI_ASSERT(flags & FLAG_ARG_NEEDS_COPY);
|
||||||
|
goto putgpr;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
gprvalue = *(unsigned char *)*p_argv;
|
||||||
|
goto putgpr;
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
gprvalue = *(signed char *)*p_argv;
|
||||||
|
goto putgpr;
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
gprvalue = *(unsigned short *)*p_argv;
|
||||||
|
goto putgpr;
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
gprvalue = *(signed short *)*p_argv;
|
||||||
|
goto putgpr;
|
||||||
|
|
||||||
|
case FFI_TYPE_INT:
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
case FFI_TYPE_POINTER:
|
||||||
|
gprvalue = *(unsigned *)*p_argv;
|
||||||
|
putgpr:
|
||||||
|
if (intarg_count >= NUM_GPR_ARG_REGISTERS)
|
||||||
|
*next_arg++ = gprvalue;
|
||||||
|
else
|
||||||
|
*gpr_base++ = gprvalue;
|
||||||
|
intarg_count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check that we didn't overrun the stack... */
|
||||||
|
FFI_ASSERT(copy_space >= (char *)next_arg);
|
||||||
|
FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
|
||||||
|
FFI_ASSERT((unsigned *)fpr_base
|
||||||
|
<= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
|
||||||
|
FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* All this is for the SYSV ABI. */
|
||||||
|
int i;
|
||||||
|
ffi_type **ptr;
|
||||||
|
unsigned bytes;
|
||||||
|
int fparg_count = 0, intarg_count = 0;
|
||||||
|
unsigned flags = 0;
|
||||||
|
unsigned struct_copy_size = 0;
|
||||||
|
|
||||||
|
/* All the machine-independent calculation of cif->bytes will be wrong.
|
||||||
|
Redo the calculation for SYSV. */
|
||||||
|
|
||||||
|
/* Space for the frame pointer, callee's LR, and the asm's temp regs. */
|
||||||
|
bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof(int);
|
||||||
|
|
||||||
|
/* Space for the GPR registers. */
|
||||||
|
bytes += NUM_GPR_ARG_REGISTERS * sizeof(int);
|
||||||
|
|
||||||
|
/* Return value handling. The rules are as follows:
|
||||||
|
- 32-bit (or less) integer values are returned in gpr3;
|
||||||
|
- Structures of size <= 4 bytes also returned in gpr3;
|
||||||
|
- 64-bit integer values and structures between 5 and 8 bytes are returned
|
||||||
|
in gpr3 and gpr4;
|
||||||
|
- Single/double FP values are returned in fpr1;
|
||||||
|
- Larger structures and long double (if not equivalent to double) values
|
||||||
|
are allocated space and a pointer is passed as the first argument. */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
flags |= FLAG_RETURNS_64BITS;
|
||||||
|
/* Fall through. */
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
flags |= FLAG_RETURNS_FP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
flags |= FLAG_RETURNS_64BITS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
if (cif->abi != FFI_GCC_SYSV)
|
||||||
|
if (cif->rtype->size <= 4)
|
||||||
|
break;
|
||||||
|
else if (cif->rtype->size <= 8)
|
||||||
|
{
|
||||||
|
flags |= FLAG_RETURNS_64BITS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* else fall through. */
|
||||||
|
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
#endif
|
||||||
|
intarg_count++;
|
||||||
|
flags |= FLAG_RETVAL_REFERENCE;
|
||||||
|
/* Fall through. */
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
flags |= FLAG_RETURNS_NOTHING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Returns 32-bit integer, or similar. Nothing to do here. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
|
||||||
|
first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
|
||||||
|
goes on the stack. Structures and long doubles (if not equivalent
|
||||||
|
to double) are passed as a pointer to a copy of the structure.
|
||||||
|
Stuff on the stack needs to keep proper alignment. */
|
||||||
|
for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
|
||||||
|
{
|
||||||
|
switch ((*ptr)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
fparg_count++;
|
||||||
|
/* If this FP arg is going on the stack, it must be
|
||||||
|
8-byte-aligned. */
|
||||||
|
if (fparg_count > NUM_FPR_ARG_REGISTERS
|
||||||
|
&& intarg_count%2 != 0)
|
||||||
|
intarg_count++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
/* 'long long' arguments are passed as two words, but
|
||||||
|
either both words must fit in registers or both go
|
||||||
|
on the stack. If they go on the stack, they must
|
||||||
|
be 8-byte-aligned. */
|
||||||
|
if (intarg_count == NUM_GPR_ARG_REGISTERS-1
|
||||||
|
|| intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count%2 != 0)
|
||||||
|
intarg_count++;
|
||||||
|
intarg_count += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
#endif
|
||||||
|
/* We must allocate space for a copy of these to enforce
|
||||||
|
pass-by-value. Pad the space up to a multiple of 16
|
||||||
|
bytes (the maximum alignment required for anything under
|
||||||
|
the SYSV ABI). */
|
||||||
|
struct_copy_size += ((*ptr)->size + 15) & ~0xF;
|
||||||
|
/* Fall through (allocate space for the pointer). */
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Everything else is passed as a 4-byte word in a GPR, either
|
||||||
|
the object itself or a pointer to it. */
|
||||||
|
intarg_count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fparg_count != 0)
|
||||||
|
flags |= FLAG_FP_ARGUMENTS;
|
||||||
|
if (intarg_count > 4)
|
||||||
|
flags |= FLAG_4_GPR_ARGUMENTS;
|
||||||
|
if (struct_copy_size != 0)
|
||||||
|
flags |= FLAG_ARG_NEEDS_COPY;
|
||||||
|
|
||||||
|
/* Space for the FPR registers, if needed. */
|
||||||
|
if (fparg_count != 0)
|
||||||
|
bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
|
||||||
|
|
||||||
|
/* Stack space. */
|
||||||
|
if (intarg_count > NUM_GPR_ARG_REGISTERS)
|
||||||
|
bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof(int);
|
||||||
|
if (fparg_count > NUM_FPR_ARG_REGISTERS)
|
||||||
|
bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof(double);
|
||||||
|
|
||||||
|
/* The stack space allocated needs to be a multiple of 16 bytes. */
|
||||||
|
bytes = (bytes + 15) & ~0xF;
|
||||||
|
|
||||||
|
/* Add in the space for the copied structures. */
|
||||||
|
bytes += struct_copy_size;
|
||||||
|
|
||||||
|
cif->flags = flags;
|
||||||
|
cif->bytes = bytes;
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@-declundef@*/
|
||||||
|
/*@-exportheader@*/
|
||||||
|
extern void ffi_call_SYSV(/*@out@*/ extended_cif *,
|
||||||
|
unsigned, unsigned,
|
||||||
|
/*@out@*/ unsigned *,
|
||||||
|
void (*fn)());
|
||||||
|
/*@=declundef@*/
|
||||||
|
/*@=exportheader@*/
|
||||||
|
|
||||||
|
void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
||||||
|
void (*fn)(),
|
||||||
|
/*@out@*/ void *rvalue,
|
||||||
|
/*@dependent@*/ void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return */
|
||||||
|
/* value address then we need to make one */
|
||||||
|
|
||||||
|
if ((rvalue == NULL) &&
|
||||||
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
||||||
|
{
|
||||||
|
/*@-sysunrecog@*/
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
/*@=sysunrecog@*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_SYSV:
|
||||||
|
case FFI_GCC_SYSV:
|
||||||
|
/*@-usedef@*/
|
||||||
|
ffi_call_SYSV(&ecif, -cif->bytes,
|
||||||
|
cif->flags, ecif.rvalue, fn);
|
||||||
|
/*@=usedef@*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
119
libffi/src/powerpc/sysv.S
Normal file
119
libffi/src/powerpc/sysv.S
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
sysv.h - Copyright (c) 1998 Geoffrey Keating
|
||||||
|
|
||||||
|
PowerPC Assembly glue.
|
||||||
|
|
||||||
|
$Id: sysv.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <powerpc/asm.h>
|
||||||
|
|
||||||
|
.globl ffi_prep_args
|
||||||
|
ENTRY(ffi_call_SYSV)
|
||||||
|
/* Save the old stack pointer as AP. */
|
||||||
|
mr %r8,%r1
|
||||||
|
|
||||||
|
/* Allocate the stack space we need. */
|
||||||
|
stwux %r1,%r1,%r4
|
||||||
|
/* Save registers we use. */
|
||||||
|
mflr %r9
|
||||||
|
stw %r28,-16(%r8)
|
||||||
|
stw %r29,-12(%r8)
|
||||||
|
stw %r30, -8(%r8)
|
||||||
|
stw %r31, -4(%r8)
|
||||||
|
stw %r9, 4(%r8)
|
||||||
|
|
||||||
|
/* Save arguments over call... */
|
||||||
|
mr %r31,%r5 /* flags, */
|
||||||
|
mr %r30,%r6 /* rvalue, */
|
||||||
|
mr %r29,%r7 /* function address, */
|
||||||
|
mr %r28,%r8 /* our AP. */
|
||||||
|
|
||||||
|
/* Call ffi_prep_args. */
|
||||||
|
mr %r4,%r1
|
||||||
|
bl JUMPTARGET(ffi_prep_args)
|
||||||
|
|
||||||
|
/* Now do the call. */
|
||||||
|
/* Set up cr1 with bits 4-7 of the flags. */
|
||||||
|
mtcrf 0x40,%r31
|
||||||
|
/* Get the address to call into CTR. */
|
||||||
|
mtctr %r29
|
||||||
|
/* Load all those argument registers. */
|
||||||
|
lwz %r3,-16-(8*4)(%r28)
|
||||||
|
lwz %r4,-16-(7*4)(%r28)
|
||||||
|
lwz %r5,-16-(6*4)(%r28)
|
||||||
|
lwz %r6,-16-(5*4)(%r28)
|
||||||
|
bf- 5,1f
|
||||||
|
nop
|
||||||
|
lwz %r7,-16-(4*4)(%r28)
|
||||||
|
lwz %r8,-16-(3*4)(%r28)
|
||||||
|
lwz %r9,-16-(2*4)(%r28)
|
||||||
|
lwz %r10,-16-(1*4)(%r28)
|
||||||
|
nop
|
||||||
|
1:
|
||||||
|
|
||||||
|
/* Load all the FP registers. */
|
||||||
|
bf- 6,2f
|
||||||
|
lfd %f1,-16-(8*4)-(8*8)(%r28)
|
||||||
|
lfd %f2,-16-(8*4)-(7*8)(%r28)
|
||||||
|
lfd %f3,-16-(8*4)-(6*8)(%r28)
|
||||||
|
lfd %f4,-16-(8*4)-(5*8)(%r28)
|
||||||
|
nop
|
||||||
|
lfd %f5,-16-(8*4)-(4*8)(%r28)
|
||||||
|
lfd %f6,-16-(8*4)-(3*8)(%r28)
|
||||||
|
lfd %f7,-16-(8*4)-(2*8)(%r28)
|
||||||
|
lfd %f8,-16-(8*4)-(1*8)(%r28)
|
||||||
|
2:
|
||||||
|
|
||||||
|
/* Make the call. */
|
||||||
|
bctrl
|
||||||
|
|
||||||
|
/* Now, deal with the return value. */
|
||||||
|
mtcrf 0x01,%r31
|
||||||
|
bt- 30,L(done_return_value)
|
||||||
|
bt- 29,L(fp_return_value)
|
||||||
|
stw %r3,0(%r30)
|
||||||
|
bf+ 28,L(done_return_value)
|
||||||
|
stw %r4,4(%r30)
|
||||||
|
/* Fall through... */
|
||||||
|
|
||||||
|
L(done_return_value):
|
||||||
|
/* Restore the registers we used and return. */
|
||||||
|
lwz %r9, 4(%r28)
|
||||||
|
lwz %r31, -4(%r28)
|
||||||
|
mtlr %r9
|
||||||
|
lwz %r30, -8(%r28)
|
||||||
|
lwz %r29,-12(%r28)
|
||||||
|
lwz %r28,-16(%r28)
|
||||||
|
lwz %r1,0(%r1)
|
||||||
|
blr
|
||||||
|
|
||||||
|
L(fp_return_value):
|
||||||
|
bf 28,L(float_return_value)
|
||||||
|
stfd %f1,0(%r30)
|
||||||
|
b L(done_return_value)
|
||||||
|
L(float_return_value):
|
||||||
|
stfs %f1,0(%r30)
|
||||||
|
b L(done_return_value)
|
||||||
|
END(ffi_call_SYSV)
|
||||||
143
libffi/src/prep_cif.c
Normal file
143
libffi/src/prep_cif.c
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
prep_cif.c - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
$Id: prep_cif.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Round up to SIZEOF_ARG. */
|
||||||
|
|
||||||
|
#define STACK_ARG_SIZE(x) ALIGN(x, SIZEOF_ARG)
|
||||||
|
|
||||||
|
/* Perform machine independent initialization of aggregate type
|
||||||
|
specifications. */
|
||||||
|
|
||||||
|
static ffi_status initialize_aggregate(/*@out@*/ ffi_type *arg)
|
||||||
|
{
|
||||||
|
ffi_type **ptr;
|
||||||
|
|
||||||
|
FFI_ASSERT(arg != NULL);
|
||||||
|
|
||||||
|
/*@-usedef@*/
|
||||||
|
|
||||||
|
FFI_ASSERT(arg->elements != NULL);
|
||||||
|
FFI_ASSERT(arg->size == 0);
|
||||||
|
FFI_ASSERT(arg->alignment == 0);
|
||||||
|
|
||||||
|
ptr = &(arg->elements[0]);
|
||||||
|
|
||||||
|
while ((*ptr) != NULL)
|
||||||
|
{
|
||||||
|
if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
|
||||||
|
return FFI_BAD_TYPEDEF;
|
||||||
|
|
||||||
|
/* Perform a sanity check on the argument type */
|
||||||
|
FFI_ASSERT(ffi_type_test((*ptr)));
|
||||||
|
|
||||||
|
arg->size = ALIGN(arg->size, (*ptr)->alignment);
|
||||||
|
arg->size += (*ptr)->size;
|
||||||
|
|
||||||
|
arg->alignment = (arg->alignment > (*ptr)->alignment) ?
|
||||||
|
arg->alignment : (*ptr)->alignment;
|
||||||
|
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg->size == 0)
|
||||||
|
return FFI_BAD_TYPEDEF;
|
||||||
|
else
|
||||||
|
return FFI_OK;
|
||||||
|
|
||||||
|
/*@=usedef@*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine independent ffi_cif preparation, then call
|
||||||
|
machine dependent routine. */
|
||||||
|
|
||||||
|
ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
|
||||||
|
ffi_abi abi, unsigned int nargs,
|
||||||
|
/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype,
|
||||||
|
/*@dependent@*/ ffi_type **atypes)
|
||||||
|
{
|
||||||
|
unsigned bytes = 0;
|
||||||
|
unsigned int i;
|
||||||
|
ffi_type **ptr;
|
||||||
|
|
||||||
|
FFI_ASSERT(cif != NULL);
|
||||||
|
FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi < FFI_LAST_ABI));
|
||||||
|
|
||||||
|
cif->abi = abi;
|
||||||
|
cif->arg_types = atypes;
|
||||||
|
cif->nargs = nargs;
|
||||||
|
cif->rtype = rtype;
|
||||||
|
|
||||||
|
cif->flags = 0;
|
||||||
|
|
||||||
|
/* Initialize the return type if necessary */
|
||||||
|
/*@-usedef@*/
|
||||||
|
if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK))
|
||||||
|
return FFI_BAD_TYPEDEF;
|
||||||
|
/*@=usedef@*/
|
||||||
|
|
||||||
|
/* Perform a sanity check on the return type */
|
||||||
|
FFI_ASSERT(ffi_type_test(cif->rtype));
|
||||||
|
|
||||||
|
#ifndef M68K
|
||||||
|
/* Make space for the return structure pointer */
|
||||||
|
if (cif->rtype->type == FFI_TYPE_STRUCT)
|
||||||
|
bytes = STACK_ARG_SIZE(sizeof(void*));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
|
||||||
|
{
|
||||||
|
/* Perform a sanity check on the argument type */
|
||||||
|
FFI_ASSERT(ffi_type_test(*ptr));
|
||||||
|
|
||||||
|
/* Initialize any uninitialized aggregate type definitions */
|
||||||
|
if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
|
||||||
|
return FFI_BAD_TYPEDEF;
|
||||||
|
|
||||||
|
#ifdef SPARC
|
||||||
|
if ((*ptr)->type == FFI_TYPE_STRUCT
|
||||||
|
|| (*ptr)->type == FFI_TYPE_LONGDOUBLE)
|
||||||
|
bytes += sizeof(void*);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/* Add any padding if necessary */
|
||||||
|
if (((*ptr)->alignment - 1) & bytes)
|
||||||
|
bytes = ALIGN(bytes, (*ptr)->alignment);
|
||||||
|
|
||||||
|
bytes += STACK_ARG_SIZE((*ptr)->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cif->bytes = bytes;
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
return ffi_prep_cif_machdep(cif);
|
||||||
|
}
|
||||||
|
|
||||||
216
libffi/src/sparc/ffi.c
Normal file
216
libffi/src/sparc/ffi.c
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1996 Cygnus Solutions
|
||||||
|
|
||||||
|
Sparc Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments */
|
||||||
|
|
||||||
|
void ffi_prep_args(char *stack, extended_cif *ecif)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int tmp;
|
||||||
|
int avn;
|
||||||
|
void **p_argv;
|
||||||
|
char *argp;
|
||||||
|
ffi_type **p_arg;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
|
|
||||||
|
/* Skip 16 words for the window save area */
|
||||||
|
argp = stack + 16*sizeof(void*);
|
||||||
|
|
||||||
|
/* This should only really be done when we are returning a structure,
|
||||||
|
however, it's faster just to do it all the time...
|
||||||
|
|
||||||
|
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) */
|
||||||
|
*(void **) argp = ecif->rvalue;
|
||||||
|
|
||||||
|
/* And 1 word for the structure return value. */
|
||||||
|
argp += sizeof(void*);
|
||||||
|
|
||||||
|
#ifdef USING_PURIFY
|
||||||
|
/* Purify will probably complain in our assembly routine, unless we
|
||||||
|
zero out this memory. */
|
||||||
|
|
||||||
|
((int*)argp)[0] = 0;
|
||||||
|
((int*)argp)[1] = 0;
|
||||||
|
((int*)argp)[2] = 0;
|
||||||
|
((int*)argp)[3] = 0;
|
||||||
|
((int*)argp)[4] = 0;
|
||||||
|
((int*)argp)[5] = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
|
||||||
|
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
||||||
|
i && avn;
|
||||||
|
i--, p_arg++)
|
||||||
|
{
|
||||||
|
size_t z;
|
||||||
|
|
||||||
|
if (avn)
|
||||||
|
{
|
||||||
|
avn--;
|
||||||
|
if ((*p_arg)->type == FFI_TYPE_STRUCT
|
||||||
|
|| (*p_arg)->type == FFI_TYPE_LONGDOUBLE)
|
||||||
|
{
|
||||||
|
*(unsigned int *) argp = (unsigned int)(* p_argv);
|
||||||
|
z = sizeof(void*);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
z = (*p_arg)->size;
|
||||||
|
if (z < sizeof(int))
|
||||||
|
{
|
||||||
|
z = sizeof(int);
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(signed int *) argp = *(SINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(unsigned int *) argp = *(UINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(signed int *) argp = *(SINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(unsigned int *) argp = *(UINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
*(signed int *) argp = *(SINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
*(unsigned int *) argp = *(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(argp, *p_argv, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p_argv++;
|
||||||
|
argp += z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* If we are returning a struct, this will already have been added.
|
||||||
|
Otherwise we need to add it because it's always got to be there! */
|
||||||
|
|
||||||
|
if (cif->rtype->type != FFI_TYPE_STRUCT)
|
||||||
|
cif->bytes += sizeof(void*);
|
||||||
|
|
||||||
|
/* sparc call frames require that space is allocated for 6 args,
|
||||||
|
even if they aren't used. Make that space if necessary. */
|
||||||
|
|
||||||
|
if (cif->bytes < 4*6+4)
|
||||||
|
cif->bytes = 4*6+4;
|
||||||
|
|
||||||
|
/* Adjust cif->bytes. to include 16 words for the window save area,
|
||||||
|
and maybe the struct/union return pointer area, */
|
||||||
|
|
||||||
|
cif->bytes += 64;
|
||||||
|
|
||||||
|
/* The stack must be double word aligned, so round bytes up
|
||||||
|
appropriately. */
|
||||||
|
|
||||||
|
cif->bytes = ALIGN(cif->bytes, 2*sizeof(void*));
|
||||||
|
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
cif->flags = cif->rtype->type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
cif->flags = FFI_TYPE_FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
cif->flags = FFI_TYPE_DOUBLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags = FFI_TYPE_INT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int ffi_call_V8(void *, extended_cif *, unsigned,
|
||||||
|
unsigned, unsigned *, void (*fn)());
|
||||||
|
|
||||||
|
void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return */
|
||||||
|
/* value address then we need to make one */
|
||||||
|
|
||||||
|
if ((rvalue == NULL) &&
|
||||||
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_V8:
|
||||||
|
ffi_call_V8(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, rvalue, fn);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
85
libffi/src/sparc/v8.S
Normal file
85
libffi/src/sparc/v8.S
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
|
||||||
|
|
||||||
|
Sparc Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: v8.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
#define STACKFRAME 96 /* Minimum stack framesize for SPARC */
|
||||||
|
#define ARGS (64+4) /* Offset of register area in frame */
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 8
|
||||||
|
.globl ffi_call_V8
|
||||||
|
.globl _ffi_call_V8
|
||||||
|
|
||||||
|
ffi_call_V8:
|
||||||
|
_ffi_call_V8:
|
||||||
|
save %sp, -STACKFRAME, %sp
|
||||||
|
|
||||||
|
sub %sp, %i2, %sp ! alloca() space in stack for frame to set up
|
||||||
|
add %sp, STACKFRAME, %l0 ! %l0 has start of
|
||||||
|
! frame to set up
|
||||||
|
|
||||||
|
mov %l0, %o0 ! call routine to set up frame
|
||||||
|
call %i0
|
||||||
|
mov %i1, %o1 ! (delay)
|
||||||
|
|
||||||
|
ld [%l0+ARGS], %o0 ! call foreign function
|
||||||
|
ld [%l0+ARGS+4], %o1
|
||||||
|
ld [%l0+ARGS+8], %o2
|
||||||
|
ld [%l0+ARGS+12], %o3
|
||||||
|
ld [%l0+ARGS+16], %o4
|
||||||
|
ld [%l0+ARGS+20], %o5
|
||||||
|
call %i5
|
||||||
|
mov %l0, %sp ! (delay) switch to frame
|
||||||
|
|
||||||
|
! If the return value pointer is NULL, assume no return value.
|
||||||
|
tst %i4
|
||||||
|
bz done
|
||||||
|
nop
|
||||||
|
|
||||||
|
cmp %i3, FFI_TYPE_INT
|
||||||
|
be,a done
|
||||||
|
st %o0, [%i4] ! (delay)
|
||||||
|
|
||||||
|
cmp %i3, FFI_TYPE_FLOAT
|
||||||
|
be,a done
|
||||||
|
st %f0, [%i4+0] ! (delay)
|
||||||
|
|
||||||
|
cmp %i3, FFI_TYPE_DOUBLE
|
||||||
|
bne done
|
||||||
|
nop
|
||||||
|
st %f0, [%i4+0]
|
||||||
|
st %f1, [%i4+4]
|
||||||
|
|
||||||
|
done:
|
||||||
|
ret
|
||||||
|
restore
|
||||||
|
|
||||||
|
.ffi_call_V8_end:
|
||||||
|
.size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
|
||||||
|
|
||||||
98
libffi/src/types.c
Normal file
98
libffi/src/types.c
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
types.c - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
Predefined ffi_types needed by libffi.
|
||||||
|
|
||||||
|
$Id: types.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
/* Type definitions */
|
||||||
|
|
||||||
|
#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) ffi_type ffi_type_##n = { s, a, t, NULL }
|
||||||
|
#define FFI_AGGREGATE_TYPEDEF(n, e) ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e }
|
||||||
|
|
||||||
|
/* Size and alignment are fake here. They must not be 0. */
|
||||||
|
FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID);
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef X86
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
||||||
|
|
||||||
|
#elif defined ARM
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
||||||
|
|
||||||
|
#elif defined M68K
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef X86
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
|
||||||
|
|
||||||
|
#elif defined ARM
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
|
||||||
|
|
||||||
|
#elif defined M68K
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
|
||||||
|
|
||||||
|
#elif defined SPARC
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
|
||||||
|
FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
192
libffi/src/x86/ffi.c
Normal file
192
libffi/src/x86/ffi.c
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
ffi.c - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
x86 Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: ffi.c,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <ffi.h>
|
||||||
|
#include <ffi_common.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* ffi_prep_args is called by the assembly routine once stack space
|
||||||
|
has been allocated for the function's arguments */
|
||||||
|
|
||||||
|
/*@-exportheader@*/
|
||||||
|
void ffi_prep_args(char *stack, extended_cif *ecif)
|
||||||
|
/*@=exportheader@*/
|
||||||
|
{
|
||||||
|
register unsigned int i;
|
||||||
|
register int tmp;
|
||||||
|
register unsigned int avn;
|
||||||
|
register void **p_argv;
|
||||||
|
register char *argp;
|
||||||
|
register ffi_type **p_arg;
|
||||||
|
|
||||||
|
tmp = 0;
|
||||||
|
argp = stack;
|
||||||
|
|
||||||
|
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
|
||||||
|
*(void **) argp = ecif->rvalue;
|
||||||
|
argp += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
avn = ecif->cif->nargs;
|
||||||
|
p_argv = ecif->avalue;
|
||||||
|
|
||||||
|
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
||||||
|
(i != 0) && (avn != 0);
|
||||||
|
i--, p_arg++)
|
||||||
|
{
|
||||||
|
size_t z;
|
||||||
|
|
||||||
|
/* Align if necessary */
|
||||||
|
if (((*p_arg)->alignment - 1) & (unsigned) argp) {
|
||||||
|
argp = (char *) ALIGN(argp, (*p_arg)->alignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (avn != 0)
|
||||||
|
{
|
||||||
|
avn--;
|
||||||
|
z = (*p_arg)->size;
|
||||||
|
if (z < sizeof(int))
|
||||||
|
{
|
||||||
|
z = sizeof(int);
|
||||||
|
switch ((*p_arg)->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_SINT8:
|
||||||
|
*(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT8:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT16:
|
||||||
|
*(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT16:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_SINT32:
|
||||||
|
*(signed int *) argp = (signed int)*(SINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_UINT32:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(argp, *p_argv, z);
|
||||||
|
}
|
||||||
|
p_argv++;
|
||||||
|
argp += z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform machine dependent cif processing */
|
||||||
|
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
||||||
|
{
|
||||||
|
/* Set the return type flag */
|
||||||
|
switch (cif->rtype->type)
|
||||||
|
{
|
||||||
|
case FFI_TYPE_VOID:
|
||||||
|
case FFI_TYPE_STRUCT:
|
||||||
|
case FFI_TYPE_UINT64:
|
||||||
|
case FFI_TYPE_SINT64:
|
||||||
|
case FFI_TYPE_FLOAT:
|
||||||
|
case FFI_TYPE_DOUBLE:
|
||||||
|
case FFI_TYPE_LONGDOUBLE:
|
||||||
|
cif->flags = (unsigned) cif->rtype->type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cif->flags = FFI_TYPE_INT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FFI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@-declundef@*/
|
||||||
|
/*@-exportheader@*/
|
||||||
|
extern void ffi_call_SYSV(void (*)(char *, extended_cif *),
|
||||||
|
/*@out@*/ extended_cif *,
|
||||||
|
unsigned, unsigned,
|
||||||
|
/*@out@*/ unsigned *,
|
||||||
|
void (*fn)());
|
||||||
|
/*@=declundef@*/
|
||||||
|
/*@=exportheader@*/
|
||||||
|
|
||||||
|
void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
||||||
|
void (*fn)(),
|
||||||
|
/*@out@*/ void *rvalue,
|
||||||
|
/*@dependent@*/ void **avalue)
|
||||||
|
{
|
||||||
|
extended_cif ecif;
|
||||||
|
|
||||||
|
ecif.cif = cif;
|
||||||
|
ecif.avalue = avalue;
|
||||||
|
|
||||||
|
/* If the return value is a struct and we don't have a return */
|
||||||
|
/* value address then we need to make one */
|
||||||
|
|
||||||
|
if ((rvalue == NULL) &&
|
||||||
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
||||||
|
{
|
||||||
|
/*@-sysunrecog@*/
|
||||||
|
ecif.rvalue = alloca(cif->rtype->size);
|
||||||
|
/*@=sysunrecog@*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ecif.rvalue = rvalue;
|
||||||
|
|
||||||
|
|
||||||
|
switch (cif->abi)
|
||||||
|
{
|
||||||
|
case FFI_SYSV:
|
||||||
|
/*@-usedef@*/
|
||||||
|
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
|
||||||
|
cif->flags, ecif.rvalue, fn);
|
||||||
|
/*@=usedef@*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FFI_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
129
libffi/src/x86/sysv.S
Normal file
129
libffi/src/x86/sysv.S
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
sysv.S - Copyright (c) 1996, 1998 Cygnus Solutions
|
||||||
|
|
||||||
|
X86 Foreign Function Interface
|
||||||
|
|
||||||
|
$Id: sysv.S,v 1.1 1998/11/29 16:48:16 green Exp $
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
``Software''), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define LIBFFI_ASM
|
||||||
|
#include <ffi.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
.globl ffi_prep_args
|
||||||
|
|
||||||
|
# This assumes we are using gas.
|
||||||
|
.balign 16
|
||||||
|
.globl ffi_call_SYSV
|
||||||
|
.type ffi_call_SYSV,@function
|
||||||
|
|
||||||
|
ffi_call_SYSV:
|
||||||
|
pushl %ebp
|
||||||
|
movl %esp,%ebp
|
||||||
|
|
||||||
|
# Make room for all of the new args.
|
||||||
|
movl 16(%ebp),%ecx
|
||||||
|
subl %ecx,%esp
|
||||||
|
|
||||||
|
movl %esp,%eax
|
||||||
|
|
||||||
|
# Place all of the ffi_prep_args in position
|
||||||
|
pushl 12(%ebp)
|
||||||
|
pushl %eax
|
||||||
|
call ffi_prep_args
|
||||||
|
|
||||||
|
# Return stack to previous state and call the function
|
||||||
|
addl $8,%esp
|
||||||
|
|
||||||
|
call *28(%ebp)
|
||||||
|
|
||||||
|
# Remove the space we pushed for the args
|
||||||
|
movl 16(%ebp),%ecx
|
||||||
|
addl %ecx,%esp
|
||||||
|
|
||||||
|
# Load %ecx with the return type code
|
||||||
|
movl 20(%ebp),%ecx
|
||||||
|
|
||||||
|
# If the return value pointer is NULL, assume no return value.
|
||||||
|
cmpl $0,24(%ebp)
|
||||||
|
jne retint
|
||||||
|
|
||||||
|
# Even if there is no space for the return value, we are
|
||||||
|
# obliged to handle floating-point values.
|
||||||
|
cmpl $FFI_TYPE_FLOAT,%ecx
|
||||||
|
jne noretval
|
||||||
|
fstp %st(0)
|
||||||
|
|
||||||
|
jmp epilogue
|
||||||
|
|
||||||
|
retint:
|
||||||
|
cmpl $FFI_TYPE_INT,%ecx
|
||||||
|
jne retfloat
|
||||||
|
# Load %ecx with the pointer to storage for the return value
|
||||||
|
movl 24(%ebp),%ecx
|
||||||
|
movl %eax,0(%ecx)
|
||||||
|
jmp epilogue
|
||||||
|
|
||||||
|
retfloat:
|
||||||
|
cmpl $FFI_TYPE_FLOAT,%ecx
|
||||||
|
jne retdouble
|
||||||
|
# Load %ecx with the pointer to storage for the return value
|
||||||
|
movl 24(%ebp),%ecx
|
||||||
|
fstps (%ecx)
|
||||||
|
jmp epilogue
|
||||||
|
|
||||||
|
retdouble:
|
||||||
|
cmpl $FFI_TYPE_DOUBLE,%ecx
|
||||||
|
jne retlongdouble
|
||||||
|
# Load %ecx with the pointer to storage for the return value
|
||||||
|
movl 24(%ebp),%ecx
|
||||||
|
fstpl (%ecx)
|
||||||
|
jmp epilogue
|
||||||
|
|
||||||
|
retlongdouble:
|
||||||
|
cmpl $FFI_TYPE_LONGDOUBLE,%ecx
|
||||||
|
jne retint64
|
||||||
|
# Load %ecx with the pointer to storage for the return value
|
||||||
|
movl 24(%ebp),%ecx
|
||||||
|
fstpt (%ecx)
|
||||||
|
jmp epilogue
|
||||||
|
|
||||||
|
retint64:
|
||||||
|
cmpl $FFI_TYPE_SINT64,%ecx
|
||||||
|
jne retstruct
|
||||||
|
# Load %ecx with the pointer to storage for the return value
|
||||||
|
movl 24(%ebp),%ecx
|
||||||
|
movl %eax,0(%ecx)
|
||||||
|
movl %edx,4(%ecx)
|
||||||
|
|
||||||
|
retstruct:
|
||||||
|
# Nothing to do!
|
||||||
|
|
||||||
|
noretval:
|
||||||
|
epilogue:
|
||||||
|
movl %ebp,%esp
|
||||||
|
popl %ebp
|
||||||
|
ret
|
||||||
|
.ffi_call_SYSV_end:
|
||||||
|
.size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
|
||||||
|
|
||||||
1
libffi/stamp-h.in
Normal file
1
libffi/stamp-h.in
Normal file
@@ -0,0 +1 @@
|
|||||||
|
timestamp
|
||||||
Reference in New Issue
Block a user