diff --git a/libffi/ChangeLog.libgcj b/libffi/ChangeLog.libgcj new file mode 100644 index 00000000000..a6a415f5d6b --- /dev/null +++ b/libffi/ChangeLog.libgcj @@ -0,0 +1,7 @@ +1999-08-09 Anthony Green + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CFLAGS): Compile with -fexceptions. + + * src/x86/sysv.S: Add exception handling metadata. + diff --git a/libffi/Makefile.am b/libffi/Makefile.am index 99c8f2fc3d7..91c5080f029 100644 --- a/libffi/Makefile.am +++ b/libffi/Makefile.am @@ -24,8 +24,6 @@ MULTICLEAN = true toolexecdir = $(exec_prefix)/$(target_alias) toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR) -## We don't use `libz.la' because we don't want to conflict with a -## system library of that name. toolexeclib_LTLIBRARIES = libffi.la noinst_PROGRAMS = ffitest @@ -70,6 +68,8 @@ if ARM libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) endif +AM_CFLAGS = -fexceptions + libffi_la_LDFLAGS = -release $(VERSION) INCLUDES = -I$(top_srcdir)/include -Iinclude diff --git a/libffi/Makefile.in b/libffi/Makefile.in index 256824be709..3a421f53bdd 100644 --- a/libffi/Makefile.in +++ b/libffi/Makefile.in @@ -62,6 +62,7 @@ AMTAR = @AMTAR@ AMTARFLAGS = @AMTARFLAGS@ AS = @AS@ CC = @CC@ +CXX = @CXX@ DLLTOOL = @DLLTOOL@ EXEEXT = @EXEEXT@ LD = @LD@ @@ -130,6 +131,8 @@ libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c src/raw_api.c @POWERPC_TRUE@libffi_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) +AM_CFLAGS = -fexceptions + libffi_la_LDFLAGS = -release $(VERSION) INCLUDES = -I$(top_srcdir)/include -Iinclude diff --git a/libffi/include/Makefile.am b/libffi/include/Makefile.am new file mode 100644 index 00000000000..74fd5a665db --- /dev/null +++ b/libffi/include/Makefile.am @@ -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 \ No newline at end of file diff --git a/libffi/include/Makefile.in b/libffi/include/Makefile.in new file mode 100644 index 00000000000..98c8dc77766 --- /dev/null +++ b/libffi/include/Makefile.in @@ -0,0 +1,220 @@ +# Makefile.in generated automatically by automake 1.4a from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +SHELL = @SHELL@ + +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 + +DESTDIR = + +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@ +INSTALL_STRIP_FLAG = +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AMTAR = @AMTAR@ +AMTARFLAGS = @AMTARFLAGS@ +AS = @AS@ +CC = @CC@ +CXX = @CXX@ +DLLTOOL = @DLLTOOL@ +EXEEXT = @EXEEXT@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SHELL = @SHELL@ +TARGET = @TARGET@ +TARGETDIR = @TARGETDIR@ +USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@ +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 +subdir = include +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../fficonfig.h +CONFIG_CLEAN_FILES = ffi.h +DIST_SOURCES = +DATA = $(hack_DATA) + +DIST_COMMON = $(hack_DATA) Makefile.am Makefile.in ffi.h.in + + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ 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= $(SHELL) ./config.status + +install-hackDATA: $(hack_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(hackdir) + @list='$(hack_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(hackdir)/$$f"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(hackdir)/$$f; \ + done + +uninstall-hackDATA: + @$(NORMAL_UNINSTALL) + @list='$(hack_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f $(DESTDIR)$(hackdir)/$$f"; \ + rm -f $(DESTDIR)$(hackdir)/$$f; \ + done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(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); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-hackDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-hackDATA +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(hackdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-hackDATA install-hackDATA tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all install-strip \ +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: diff --git a/libffi/include/ffi.h.in b/libffi/include/ffi.h.in new file mode 100644 index 00000000000..c28ebf6e440 --- /dev/null +++ b/libffi/include/ffi.h.in @@ -0,0 +1,421 @@ +/* -----------------------------------------------------------------*-C-*- + libffi @VERSION@ - Copyright (c) 1996-1999 Cygnus Solutions + + $Id: ffi.h.in,v 1.3 1999/08/08 13:05:12 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 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#define @TARGET@ + +/* ---- System configuration information --------------------------------- */ + +#ifdef PACKAGE +#define OLD_PACKAGE PACKAGE +#undef PACKAGE +#endif +#ifdef VERSION +#define OLD_VERSION VERSION +#undef VERSION +#endif + +#include + +#undef PACKAGE +#undef VERSION + +#ifdef OLD_PACKAGE +#define PACKAGE OLD_PACKAGE +#endif +#ifdef OLD_VERSION +#define VERSION OLD_VERSION +#endif + +#if !defined(LIBFFI_ASM) +#include +#if defined(FFI_DEBUG) +#include +#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 +#else +#define SIZEOF_ARG SIZEOF_VOID_P +#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; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#if !FFI_NO_RAW_API + +#if SIZEOF_ARG == 4 + +#define UINT_ARG UINT32 +#define SINT_ARG SINT32 + +#endif + +#if SIZEOF_ARG == 8 + +#define UINT_ARG UINT64 +#define SINT_ARG SINT64 + +#endif + +typedef union { + SINT_ARG sint; + UINT_ARG uint; + char data[SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +void ffi_raw_call (/*@dependent@*/ ffi_cif *cif, + void (*fn)(), + /*@out@*/ void *rvalue, + /*@dependent@*/ ffi_raw *avalue); + +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +size_t ffi_raw_size (ffi_cif *cif); + + + + +#endif /* !FFI_NO_RAW_API */ + +/* ---- Definitions for closures ----------------------------------------- */ + +#ifdef X86 + +#define FFI_CLOSURES 1 /* x86 supports closures */ +#define FFI_TRAMPOLINE_SIZE 10 +#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */ + +#else + +#define FFI_CLOSURES 0 +#define FFI_NATIVE_RAW_API 0 + +#endif + + + +#if FFI_CLOSURES + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +} ffi_closure; + +ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data); + +#if !FFI_NO_RAW_API + +typedef struct { + char tramp[FFI_TRAMPOLINE_SIZE]; + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* if this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +#endif /* !FFI_NO_RAW_API */ +#endif /* FFI_CLOSURES */ + +/* ---- 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 + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/libffi/include/ffi_common.h b/libffi/include/ffi_common.h new file mode 100644 index 00000000000..c9d4acf9085 --- /dev/null +++ b/libffi/include/ffi_common.h @@ -0,0 +1,91 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (c) 1996 Cygnus Solutions + + $Id: ffi_common.h,v 1.1.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 + +#ifdef __cplusplus +extern "C" { +#endif + +/* 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 +# 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 +#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 + +#ifndef __cplusplus +/* bool is a keyword in C++ */ +/*@-cppnames@*/ +typedef int bool; +/*@=cppnames@*/ +#endif + +#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; + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/libffi/include/ffi_mips.h b/libffi/include/ffi_mips.h new file mode 100644 index 00000000000..9d4a66cb8c3 --- /dev/null +++ b/libffi/include/ffi_mips.h @@ -0,0 +1,143 @@ +/* ----------------------------------------------------------------------- + ffi-mips.h - Copyright (c) 1996 Cygnus Support + + MIPS FFI Definitions + + $Id: ffi_mips.h,v 1.1.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 + +#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 diff --git a/libffi/src/x86/sysv.S b/libffi/src/x86/sysv.S index 41ac46015ef..4c8473ae901 100644 --- a/libffi/src/x86/sysv.S +++ b/libffi/src/x86/sysv.S @@ -38,9 +38,11 @@ .type ffi_call_SYSV,@function ffi_call_SYSV: +.LFB1: pushl %ebp +.LCFI0: movl %esp,%ebp - +.LCFI1: # Make room for all of the new args. movl 16(%ebp),%ecx subl %ecx,%esp @@ -124,6 +126,43 @@ epilogue: movl %ebp,%esp popl %ebp ret +.LFE1: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV +.section .eh_frame,"aw",@progbits +__FRAME_BEGIN__: + .4byte .LLCIE1 +.LSCIE1: + .4byte 0x0 + .byte 0x1 + .byte 0x0 + .byte 0x1 + .byte 0x7c + .byte 0x8 + .byte 0xc + .byte 0x4 + .byte 0x4 + .byte 0x88 + .byte 0x1 + .align 4 +.LECIE1: + .set .LLCIE1,.LECIE1-.LSCIE1 + .4byte .LLFDE1 +.LSFDE1: + .4byte .LSFDE1-__FRAME_BEGIN__ + .4byte .LFB1 + .4byte .LFE1-.LFB1 + .byte 0x4 + .4byte .LCFI0-.LFB1 + .byte 0xe + .byte 0x8 + .byte 0x85 + .byte 0x2 + .byte 0x4 + .4byte .LCFI1-.LCFI0 + .byte 0xd + .byte 0x5 + .align 4 +.LEFDE1: + .set .LLFDE1,.LEFDE1-.LSFDE1