yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am yann@1: --- gcc-3.2.2.orig/libffi/Makefile.am Tue Jan 28 10:43:56 2003 yann@1: +++ gcc/libffi/Makefile.am Tue Jan 28 10:48:33 2003 yann@1: @@ -8,14 +8,17 @@ yann@1: src/mips/n32.s src/mips/o32.S src/mips/o32.s \ yann@1: src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ yann@1: src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ yann@1: + src/x86/ffi64.c src/x86/unix64.S \ yann@1: src/alpha/ffi.c src/alpha/osf.S \ yann@1: src/m68k/ffi.c src/m68k/sysv.S \ yann@1: src/powerpc/ffi.c src/powerpc/sysv.S \ yann@1: src/powerpc/ppc_closure.S src/powerpc/asm.h \ yann@1: src/powerpc/ffi_darwin.c \ yann@1: src/powerpc/darwin.S src/powerpc/aix.S \ yann@1: - src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ yann@1: - src/arm/ffi.c src/arm/sysv.S yann@1: + src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ yann@1: + src/arm/ffi.c src/arm/sysv.S \ yann@1: + src/s390/ffi.c src/s390/sysv.S \ yann@1: + src/sh/ffi.c src/sh/sysv.S yann@1: yann@1: VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ yann@1: yann@1: @@ -83,6 +86,7 @@ yann@1: ffitest_LDFLAGS = -shared-libgcc yann@1: yann@1: TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S yann@1: +TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S yann@1: TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s yann@1: TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S yann@1: TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S yann@1: @@ -91,9 +95,12 @@ yann@1: TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S yann@1: TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S yann@1: TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S yann@1: -TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S yann@1: +TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S yann@1: TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S yann@1: TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c yann@1: +TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c yann@1: +TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S yann@1: +TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c yann@1: yann@1: ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@) yann@1: ## Work around automake deficiency yann@1: @@ -103,6 +110,10 @@ yann@1: libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) yann@1: libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) yann@1: endif yann@1: +if MIPS_LINUX yann@1: +libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) yann@1: +libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) yann@1: +endif yann@1: if MIPS_SGI yann@1: libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) yann@1: libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) yann@1: @@ -147,6 +158,18 @@ yann@1: libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) yann@1: libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) yann@1: endif yann@1: +if S390 yann@1: +libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) yann@1: +libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) yann@1: +endif yann@1: +if X86_64 yann@1: +libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) yann@1: +libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) yann@1: +endif yann@1: +if SH yann@1: +libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) yann@1: +libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) yann@1: +endif yann@1: yann@1: AM_CFLAGS = -fexceptions yann@1: yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in yann@1: --- gcc-3.2.2.orig/libffi/Makefile.in Wed Jan 29 07:59:05 2003 yann@1: +++ gcc/libffi/Makefile.in Wed Jan 29 07:58:58 2003 yann@1: @@ -91,14 +91,17 @@ yann@1: src/mips/n32.s src/mips/o32.S src/mips/o32.s \ yann@1: src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ yann@1: src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ yann@1: + src/x86/ffi64.c src/x86/unix64.S \ yann@1: src/alpha/ffi.c src/alpha/osf.S \ yann@1: src/m68k/ffi.c src/m68k/sysv.S \ yann@1: src/powerpc/ffi.c src/powerpc/sysv.S \ yann@1: src/powerpc/ppc_closure.S src/powerpc/asm.h \ yann@1: src/powerpc/ffi_darwin.c \ yann@1: src/powerpc/darwin.S src/powerpc/aix.S \ yann@1: - src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ yann@1: - src/arm/ffi.c src/arm/sysv.S yann@1: + src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ yann@1: + src/arm/ffi.c src/arm/sysv.S \ yann@1: + src/s390/ffi.c src/s390/sysv.S \ yann@1: + src/sh/ffi.c src/sh/sysv.S yann@1: yann@1: yann@1: VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ yann@1: @@ -162,6 +165,7 @@ yann@1: ffitest_LDFLAGS = -shared-libgcc yann@1: yann@1: TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S yann@1: +TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S yann@1: TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s yann@1: TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S yann@1: TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S yann@1: @@ -170,14 +174,18 @@ yann@1: TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S yann@1: TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S yann@1: TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S yann@1: -TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S yann@1: +TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S yann@1: TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S yann@1: TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c yann@1: +TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c yann@1: +TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S yann@1: +TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c yann@1: yann@1: libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \ yann@1: src/raw_api.c src/java_raw_api.c yann@1: yann@1: @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) yann@1: +@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) yann@1: @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) yann@1: @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) yann@1: @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) yann@1: @@ -189,7 +197,11 @@ yann@1: @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) yann@1: @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) yann@1: @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) yann@1: +@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) yann@1: +@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) yann@1: +@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) yann@1: @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) yann@1: +@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) yann@1: @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) yann@1: @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) yann@1: @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) yann@1: @@ -201,6 +213,9 @@ yann@1: @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) yann@1: @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) yann@1: @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) yann@1: +@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) yann@1: +@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) yann@1: +@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) yann@1: yann@1: AM_CFLAGS = -fexceptions yann@1: yann@1: @@ -208,7 +223,7 @@ yann@1: yann@1: INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src yann@1: ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 yann@1: -mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs yann@1: +mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs yann@1: CONFIG_HEADER = fficonfig.h yann@1: CONFIG_CLEAN_FILES = yann@1: LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) yann@1: @@ -220,10 +235,6 @@ yann@1: LIBS = @LIBS@ yann@1: libffi_convenience_la_LDFLAGS = yann@1: libffi_convenience_la_LIBADD = yann@1: -@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: -@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: -@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ yann@1: -@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo yann@1: @ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo yann@1: @@ -234,12 +245,29 @@ yann@1: @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ yann@1: @MIPS_GCC_TRUE@src/mips/n32.lo yann@1: -@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: -@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: -@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo yann@1: +@S390_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo yann@1: @M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo yann@1: +@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo yann@1: +@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: +@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: +@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ yann@1: +@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo yann@1: +@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: +@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: +@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo yann@1: +@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: +@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: +@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo yann@1: +@X86_64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: +@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: +@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \ yann@1: +@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo yann@1: @SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \ yann@1: @@ -247,62 +275,75 @@ yann@1: @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ yann@1: -@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo yann@1: -@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo yann@1: -@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo yann@1: +@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo yann@1: +@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: +@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: +@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ yann@1: +@MIPS_SGI_TRUE@src/mips/n32.lo yann@1: @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo yann@1: -@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ yann@1: -@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ yann@1: -@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ yann@1: -@MIPS_SGI_TRUE@src/mips/n32.lo yann@1: +@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo yann@1: +@SH_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo yann@1: libffi_la_LIBADD = yann@1: +@SH_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ yann@1: +@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \ yann@1: +@SH_TRUE@src/sh/ffi.lo yann@1: +@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo yann@1: +@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ yann@1: +@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ yann@1: +@X86_TRUE@src/x86/sysv.lo yann@1: @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \ yann@1: @POWERPC_TRUE@src/powerpc/ppc_closure.lo yann@1: -@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo yann@1: -@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo yann@1: -@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo yann@1: -@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo yann@1: -@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo yann@1: +@MIPS_LINUX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo yann@1: @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo yann@1: @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \ yann@1: -@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo yann@1: -@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ yann@1: -@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ yann@1: -@X86_TRUE@src/x86/sysv.lo yann@1: +@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo yann@1: +@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo yann@1: @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ yann@1: @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ yann@1: @ARM_TRUE@src/arm/ffi.lo yann@1: +@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo yann@1: +@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo yann@1: +@S390_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo yann@1: +@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo yann@1: +@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo yann@1: +@X86_64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: +@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: +@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \ yann@1: +@X86_64_TRUE@src/x86/sysv.lo yann@1: @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \ yann@1: @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo yann@1: -@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ yann@1: -@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ yann@1: -@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo yann@1: noinst_PROGRAMS = ffitest$(EXEEXT) yann@1: PROGRAMS = $(noinst_PROGRAMS) yann@1: yann@1: @@ -578,8 +616,8 @@ yann@1: -chmod 777 $(distdir) yann@1: $(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \ yann@1: $(distdir)/src/m68k $(distdir)/src/mips \ yann@1: - $(distdir)/src/powerpc $(distdir)/src/sparc \ yann@1: - $(distdir)/src/x86 yann@1: + $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \ yann@1: + $(distdir)/src/sparc $(distdir)/src/x86 yann@1: @for file in $(DISTFILES); do \ yann@1: if test -f $$file; then d=.; else d=$(srcdir); fi; \ yann@1: if test -d $$d/$$file; then \ yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4 yann@1: --- gcc-3.2.2.orig/libffi/acinclude.m4 Sun Sep 10 16:43:14 2000 yann@1: +++ gcc/libffi/acinclude.m4 Tue Dec 17 03:22:47 2002 yann@1: @@ -4,5 +4,8 @@ yann@1: dnl to add a definition of LIBTOOL to Makefile.in. yann@1: ifelse(yes,no,[ yann@1: AC_DEFUN([AC_PROG_LIBTOOL],) yann@1: +AC_DEFUN([AM_PROG_LIBTOOL],) yann@1: AC_SUBST(LIBTOOL) yann@1: ]) yann@1: + yann@1: +sinclude(../config/accross.m4) yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4 yann@1: --- gcc-3.2.2.orig/libffi/aclocal.m4 Fri Feb 1 07:25:31 2002 yann@1: +++ gcc/libffi/aclocal.m4 Tue Dec 17 03:22:47 2002 yann@1: @@ -1,6 +1,6 @@ yann@1: -dnl aclocal.m4 generated automatically by aclocal 1.4 yann@1: +dnl aclocal.m4 generated automatically by aclocal 1.4-p5 yann@1: yann@1: -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. yann@1: +dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. yann@1: dnl This file is free software; the Free Software Foundation yann@1: dnl gives unlimited permission to copy and/or distribute it, yann@1: dnl with or without modifications, as long as this notice is preserved. yann@1: @@ -16,108 +16,15 @@ yann@1: dnl to add a definition of LIBTOOL to Makefile.in. yann@1: ifelse(yes,no,[ yann@1: AC_DEFUN([AC_PROG_LIBTOOL],) yann@1: +AC_DEFUN([AM_PROG_LIBTOOL],) yann@1: AC_SUBST(LIBTOOL) yann@1: ]) yann@1: yann@1: -AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], yann@1: -[changequote(<<, >>)dnl yann@1: -dnl The name to #define. yann@1: -define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl yann@1: -dnl The cache variable name. yann@1: -define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl yann@1: -changequote([, ])dnl yann@1: -AC_MSG_CHECKING(size of $1) yann@1: -AC_CACHE_VAL(AC_CV_NAME, yann@1: -[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. yann@1: - AC_TRY_COMPILE([#include "confdefs.h" yann@1: -#include yann@1: -$2 yann@1: -], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) yann@1: - if test x$AC_CV_NAME != x ; then break; fi yann@1: -done yann@1: -]) yann@1: -if test x$AC_CV_NAME = x ; then yann@1: - AC_MSG_ERROR([cannot determine a size for $1]) yann@1: -fi yann@1: -AC_MSG_RESULT($AC_CV_NAME) yann@1: -AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) yann@1: -undefine([AC_TYPE_NAME])dnl yann@1: -undefine([AC_CV_NAME])dnl yann@1: -]) yann@1: - yann@1: -AC_DEFUN([AC_C_BIGENDIAN_CROSS], yann@1: -[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, yann@1: -[ac_cv_c_bigendian=unknown yann@1: -# See if sys/param.h defines the BYTE_ORDER macro. yann@1: -AC_TRY_COMPILE([#include yann@1: -#include ], [ yann@1: -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN yann@1: - bogus endian macros yann@1: -#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. yann@1: -AC_TRY_COMPILE([#include yann@1: -#include ], [ yann@1: -#if BYTE_ORDER != BIG_ENDIAN yann@1: - not big endian yann@1: -#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) yann@1: -if test $ac_cv_c_bigendian = unknown; then yann@1: -AC_TRY_RUN([main () { yann@1: - /* Are we little or big endian? From Harbison&Steele. */ yann@1: - union yann@1: - { yann@1: - long l; yann@1: - char c[sizeof (long)]; yann@1: - } u; yann@1: - u.l = 1; yann@1: - exit (u.c[sizeof (long) - 1] == 1); yann@1: -}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, yann@1: -[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) yann@1: -fi]) yann@1: -if test $ac_cv_c_bigendian = unknown; then yann@1: -AC_MSG_CHECKING(to probe for byte ordering) yann@1: -[ yann@1: -cat >conftest.c <&AC_FD_MSG yann@1: - ac_cv_c_bigendian=yes yann@1: - fi yann@1: - if test `grep -l LiTTleEnDian conftest.o` ; then yann@1: - echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG yann@1: - if test $ac_cv_c_bigendian = yes ; then yann@1: - ac_cv_c_bigendian=unknown; yann@1: - else yann@1: - ac_cv_c_bigendian=no yann@1: - fi yann@1: - fi yann@1: - echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG yann@1: - fi yann@1: - fi yann@1: -AC_MSG_RESULT($ac_cv_c_bigendian) yann@1: -fi yann@1: -if test $ac_cv_c_bigendian = yes; then yann@1: - AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) yann@1: - BYTEORDER=4321 yann@1: -else yann@1: - BYTEORDER=1234 yann@1: -fi yann@1: -AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) yann@1: -if test $ac_cv_c_bigendian = unknown; then yann@1: - AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) yann@1: -fi yann@1: -]) yann@1: +sinclude(../config/accross.m4) yann@1: yann@1: # Like AC_CONFIG_HEADER, but automatically create stamp file. yann@1: yann@1: -AC_DEFUN(AM_CONFIG_HEADER, yann@1: +AC_DEFUN([AM_CONFIG_HEADER], yann@1: [AC_PREREQ([2.12]) yann@1: AC_CONFIG_HEADER([$1]) yann@1: dnl When config.status generates a header, we must update the stamp-h file. yann@1: @@ -147,7 +54,7 @@ yann@1: dnl Usage: yann@1: dnl AM_INIT_AUTOMAKE(package,version, [no-define]) yann@1: yann@1: -AC_DEFUN(AM_INIT_AUTOMAKE, yann@1: +AC_DEFUN([AM_INIT_AUTOMAKE], yann@1: [AC_REQUIRE([AC_PROG_INSTALL]) yann@1: PACKAGE=[$1] yann@1: AC_SUBST(PACKAGE) yann@1: @@ -175,7 +82,7 @@ yann@1: # Check to make sure that the build environment is sane. yann@1: # yann@1: yann@1: -AC_DEFUN(AM_SANITY_CHECK, yann@1: +AC_DEFUN([AM_SANITY_CHECK], yann@1: [AC_MSG_CHECKING([whether build environment is sane]) yann@1: # Just in case yann@1: sleep 1 yann@1: @@ -216,7 +123,7 @@ yann@1: yann@1: dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) yann@1: dnl The program must properly implement --version. yann@1: -AC_DEFUN(AM_MISSING_PROG, yann@1: +AC_DEFUN([AM_MISSING_PROG], yann@1: [AC_MSG_CHECKING(for working $2) yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: @@ -235,7 +142,7 @@ yann@1: yann@1: # serial 1 yann@1: yann@1: -AC_DEFUN(AM_MAINTAINER_MODE, yann@1: +AC_DEFUN([AM_MAINTAINER_MODE], yann@1: [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) yann@1: dnl maintainer-mode is disabled by default yann@1: AC_ARG_ENABLE(maintainer-mode, yann@1: @@ -252,7 +159,7 @@ yann@1: yann@1: # Define a conditional. yann@1: yann@1: -AC_DEFUN(AM_CONDITIONAL, yann@1: +AC_DEFUN([AM_CONDITIONAL], yann@1: [AC_SUBST($1_TRUE) yann@1: AC_SUBST($1_FALSE) yann@1: if $2; then yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure yann@1: --- gcc-3.2.2.orig/libffi/configure Wed Jan 29 07:59:05 2003 yann@1: +++ gcc/libffi/configure Sat Feb 1 20:16:19 2003 yann@1: @@ -633,17 +633,16 @@ yann@1: yann@1: if test "${srcdir}" = "."; then yann@1: if test "${with_target_subdir}" != "."; then yann@1: - libffi_basedir="${srcdir}/${with_multisrctop}.." yann@1: + libffi_basedir="${with_multisrctop}../" yann@1: else yann@1: - libffi_basedir="${srcdir}/${with_multisrctop}" yann@1: + libffi_basedir="${with_multisrctop}" yann@1: fi yann@1: else yann@1: - libffi_basedir="${srcdir}" yann@1: + libffi_basedir= yann@1: fi yann@1: yann@1: - yann@1: ac_aux_dir= yann@1: -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do yann@1: +for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do yann@1: if test -f $ac_dir/install-sh; then yann@1: ac_aux_dir=$ac_dir yann@1: ac_install_sh="$ac_aux_dir/install-sh -c" yann@1: @@ -655,13 +654,14 @@ yann@1: fi yann@1: done yann@1: if test -z "$ac_aux_dir"; then yann@1: - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } yann@1: + { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; } yann@1: fi yann@1: ac_config_guess=$ac_aux_dir/config.guess yann@1: ac_config_sub=$ac_aux_dir/config.sub yann@1: ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. yann@1: yann@1: yann@1: + yann@1: # Make sure we can run config.sub. yann@1: if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : yann@1: else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } yann@1: @@ -1238,9 +1238,18 @@ yann@1: ;; yann@1: yann@1: hpux10.20*|hpux11*) yann@1: - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' yann@1: - lt_cv_file_magic_cmd=/usr/bin/file yann@1: - lt_cv_file_magic_test_file=/usr/lib/libc.sl yann@1: + case $host_cpu in yann@1: + hppa*) yann@1: + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' yann@1: + lt_cv_file_magic_cmd=/usr/bin/file yann@1: + lt_cv_file_magic_test_file=/usr/lib/libc.sl yann@1: + ;; yann@1: + ia64*) yann@1: + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' yann@1: + lt_cv_file_magic_cmd=/usr/bin/file yann@1: + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so yann@1: + ;; yann@1: + esac yann@1: ;; yann@1: yann@1: irix5* | irix6*) yann@1: @@ -1267,7 +1276,7 @@ yann@1: # This must be Linux ELF. yann@1: linux-gnu*) yann@1: case $host_cpu in yann@1: - alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) yann@1: + alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) yann@1: lt_cv_deplibs_check_method=pass_all ;; yann@1: *) yann@1: # glibc up to 2.1.1 does not perform some relocations on ARM yann@1: @@ -1330,13 +1339,13 @@ yann@1: deplibs_check_method=$lt_cv_deplibs_check_method yann@1: yann@1: echo $ac_n "checking for object suffix""... $ac_c" 1>&6 yann@1: -echo "configure:1334: checking for object suffix" >&5 yann@1: +echo "configure:1343: checking for object suffix" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: rm -f conftest* yann@1: echo 'int i = 1;' > conftest.$ac_ext yann@1: -if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: for ac_file in conftest.*; do yann@1: case $ac_file in yann@1: *.c) ;; yann@1: @@ -1356,7 +1365,7 @@ yann@1: yann@1: yann@1: echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 yann@1: -echo "configure:1360: checking for executable suffix" >&5 yann@1: +echo "configure:1369: checking for executable suffix" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1366,7 +1375,7 @@ yann@1: rm -f conftest* yann@1: echo 'int main () { return 0; }' > conftest.$ac_ext yann@1: ac_cv_exeext= yann@1: - if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then yann@1: + if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then yann@1: for file in conftest.*; do yann@1: case $file in yann@1: *.c | *.o | *.obj) ;; yann@1: @@ -1399,7 +1408,7 @@ yann@1: file_magic*) yann@1: if test "$file_magic_cmd" = '$MAGIC_CMD'; then yann@1: echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 yann@1: -echo "configure:1403: checking for ${ac_tool_prefix}file" >&5 yann@1: +echo "configure:1412: checking for ${ac_tool_prefix}file" >&5 yann@1: if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1461,7 +1470,7 @@ yann@1: if test -z "$lt_cv_path_MAGIC_CMD"; then yann@1: if test -n "$ac_tool_prefix"; then yann@1: echo $ac_n "checking for file""... $ac_c" 1>&6 yann@1: -echo "configure:1465: checking for file" >&5 yann@1: +echo "configure:1474: checking for file" >&5 yann@1: if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1532,7 +1541,7 @@ yann@1: # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. yann@1: set dummy ${ac_tool_prefix}ranlib; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:1536: checking for $ac_word" >&5 yann@1: +echo "configure:1545: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1564,7 +1573,7 @@ yann@1: # Extract the first word of "ranlib", so it can be a program name with args. yann@1: set dummy ranlib; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:1568: checking for $ac_word" >&5 yann@1: +echo "configure:1577: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1599,7 +1608,7 @@ yann@1: # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. yann@1: set dummy ${ac_tool_prefix}strip; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:1603: checking for $ac_word" >&5 yann@1: +echo "configure:1612: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1631,7 +1640,7 @@ yann@1: # Extract the first word of "strip", so it can be a program name with args. yann@1: set dummy strip; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:1635: checking for $ac_word" >&5 yann@1: +echo "configure:1644: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1698,8 +1707,8 @@ yann@1: case $host in yann@1: *-*-irix6*) yann@1: # Find out which ABI we are using. yann@1: - echo '#line 1702 "configure"' > conftest.$ac_ext yann@1: - if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: + echo '#line 1711 "configure"' > conftest.$ac_ext yann@1: + if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: case `/usr/bin/file conftest.$ac_objext` in yann@1: *32-bit*) yann@1: LD="${LD-ld} -32" yann@1: @@ -1715,12 +1724,70 @@ yann@1: rm -rf conftest* yann@1: ;; yann@1: yann@1: +ia64-*-hpux*) yann@1: + # Find out which ABI we are using. yann@1: + echo 'int i;' > conftest.$ac_ext yann@1: + if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: + case "`/usr/bin/file conftest.o`" in yann@1: + *ELF-32*) yann@1: + HPUX_IA64_MODE="32" yann@1: + ;; yann@1: + *ELF-64*) yann@1: + HPUX_IA64_MODE="64" yann@1: + ;; yann@1: + esac yann@1: + fi yann@1: + rm -rf conftest* yann@1: + ;; yann@1: + yann@1: +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) yann@1: + # Find out which ABI we are using. yann@1: + echo 'int i;' > conftest.$ac_ext yann@1: + if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: + case "`/usr/bin/file conftest.o`" in yann@1: + *32-bit*) yann@1: + case $host in yann@1: + x86_64-*linux*) yann@1: + LD="${LD-ld} -m elf_i386" yann@1: + ;; yann@1: + ppc64-*linux*) yann@1: + LD="${LD-ld} -m elf32ppclinux" yann@1: + ;; yann@1: + s390x-*linux*) yann@1: + LD="${LD-ld} -m elf_s390" yann@1: + ;; yann@1: + sparc64-*linux*) yann@1: + LD="${LD-ld} -m elf32_sparc" yann@1: + ;; yann@1: + esac yann@1: + ;; yann@1: + *64-bit*) yann@1: + case $host in yann@1: + x86_64-*linux*) yann@1: + LD="${LD-ld} -m elf_x86_64" yann@1: + ;; yann@1: + ppc*-*linux*|powerpc*-*linux*) yann@1: + LD="${LD-ld} -m elf64ppc" yann@1: + ;; yann@1: + s390*-*linux*) yann@1: + LD="${LD-ld} -m elf64_s390" yann@1: + ;; yann@1: + sparc*-*linux*) yann@1: + LD="${LD-ld} -m elf64_sparc" yann@1: + ;; yann@1: + esac yann@1: + ;; yann@1: + esac yann@1: + fi yann@1: + rm -rf conftest* yann@1: + ;; yann@1: + yann@1: *-*-sco3.2v5*) yann@1: # On SCO OpenServer 5, we need -belf to get full-featured binaries. yann@1: SAVE_CFLAGS="$CFLAGS" yann@1: CFLAGS="$CFLAGS -belf" yann@1: echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 yann@1: -echo "configure:1724: checking whether the C compiler needs -belf" >&5 yann@1: +echo "configure:1791: checking whether the C compiler needs -belf" >&5 yann@1: if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -1733,14 +1800,14 @@ yann@1: cross_compiling=$ac_cv_prog_cc_cross yann@1: yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: lt_cv_cc_needs_belf=yes yann@1: else yann@1: @@ -1868,7 +1935,7 @@ yann@1: # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" yann@1: # ./install, which can be erroneously created by make from ./install.sh. yann@1: echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 yann@1: -echo "configure:1872: checking for a BSD compatible install" >&5 yann@1: +echo "configure:1939: checking for a BSD compatible install" >&5 yann@1: if test -z "$INSTALL"; then yann@1: if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: @@ -1921,7 +1988,7 @@ yann@1: test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' yann@1: yann@1: echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 yann@1: -echo "configure:1925: checking whether build environment is sane" >&5 yann@1: +echo "configure:1992: checking whether build environment is sane" >&5 yann@1: # Just in case yann@1: sleep 1 yann@1: echo timestamp > conftestfile yann@1: @@ -1978,7 +2045,7 @@ yann@1: test "$program_transform_name" = "" && program_transform_name="s,x,x," yann@1: yann@1: echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 yann@1: -echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5 yann@1: +echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5 yann@1: set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` yann@1: if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: @@ -2017,7 +2084,7 @@ yann@1: yann@1: missing_dir=`cd $ac_aux_dir && pwd` yann@1: echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 yann@1: -echo "configure:2021: checking for working aclocal" >&5 yann@1: +echo "configure:2088: checking for working aclocal" >&5 yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: # Redirect stdin to placate older versions of autoconf. Sigh. yann@1: @@ -2030,7 +2097,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 yann@1: -echo "configure:2034: checking for working autoconf" >&5 yann@1: +echo "configure:2101: checking for working autoconf" >&5 yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: # Redirect stdin to placate older versions of autoconf. Sigh. yann@1: @@ -2043,7 +2110,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking for working automake""... $ac_c" 1>&6 yann@1: -echo "configure:2047: checking for working automake" >&5 yann@1: +echo "configure:2114: checking for working automake" >&5 yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: # Redirect stdin to placate older versions of autoconf. Sigh. yann@1: @@ -2056,7 +2123,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 yann@1: -echo "configure:2060: checking for working autoheader" >&5 yann@1: +echo "configure:2127: checking for working autoheader" >&5 yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: # Redirect stdin to placate older versions of autoconf. Sigh. yann@1: @@ -2069,7 +2136,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 yann@1: -echo "configure:2073: checking for working makeinfo" >&5 yann@1: +echo "configure:2140: checking for working makeinfo" >&5 yann@1: # Run test in a subshell; some versions of sh will print an error if yann@1: # an executable is not found, even if stderr is redirected. yann@1: # Redirect stdin to placate older versions of autoconf. Sigh. yann@1: @@ -2086,7 +2153,7 @@ yann@1: yann@1: yann@1: echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 yann@1: -echo "configure:2090: checking for executable suffix" >&5 yann@1: +echo "configure:2157: checking for executable suffix" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2096,7 +2163,7 @@ yann@1: rm -f conftest* yann@1: echo 'int main () { return 0; }' > conftest.$ac_ext yann@1: ac_cv_exeext= yann@1: - if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then yann@1: + if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then yann@1: for file in conftest.*; do yann@1: case $file in yann@1: *.c | *.o | *.obj) ;; yann@1: @@ -2117,7 +2184,7 @@ yann@1: ac_exeext=$EXEEXT yann@1: yann@1: echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 yann@1: -echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5 yann@1: +echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5 yann@1: # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. yann@1: if test "${enable_maintainer_mode+set}" = set; then yann@1: enableval="$enable_maintainer_mode" yann@1: @@ -2143,7 +2210,7 @@ yann@1: # Extract the first word of "gcc", so it can be a program name with args. yann@1: set dummy gcc; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:2147: checking for $ac_word" >&5 yann@1: +echo "configure:2214: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2173,7 +2240,7 @@ yann@1: # Extract the first word of "cc", so it can be a program name with args. yann@1: set dummy cc; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:2177: checking for $ac_word" >&5 yann@1: +echo "configure:2244: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2224,7 +2291,7 @@ yann@1: # Extract the first word of "cl", so it can be a program name with args. yann@1: set dummy cl; ac_word=$2 yann@1: echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 yann@1: -echo "configure:2228: checking for $ac_word" >&5 yann@1: +echo "configure:2295: checking for $ac_word" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2256,7 +2323,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 yann@1: -echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 yann@1: +echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 yann@1: yann@1: ac_ext=c yann@1: # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. yann@1: @@ -2267,12 +2334,12 @@ yann@1: yann@1: cat > conftest.$ac_ext << EOF yann@1: yann@1: -#line 2271 "configure" yann@1: +#line 2338 "configure" yann@1: #include "confdefs.h" yann@1: yann@1: main(){return(0);} yann@1: EOF yann@1: -if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: ac_cv_prog_cc_works=yes yann@1: # If we can't run a trivial program, we are probably using a cross compiler. yann@1: if (./conftest; exit) 2>/dev/null; then yann@1: @@ -2298,12 +2365,12 @@ yann@1: { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } yann@1: fi yann@1: echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 yann@1: -echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 yann@1: +echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 yann@1: echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 yann@1: cross_compiling=$ac_cv_prog_cc_cross yann@1: yann@1: echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 yann@1: -echo "configure:2307: checking whether we are using GNU C" >&5 yann@1: +echo "configure:2374: checking whether we are using GNU C" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2312,7 +2379,7 @@ yann@1: yes; yann@1: #endif yann@1: EOF yann@1: -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then yann@1: +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then yann@1: ac_cv_prog_gcc=yes yann@1: else yann@1: ac_cv_prog_gcc=no yann@1: @@ -2331,7 +2398,7 @@ yann@1: ac_save_CFLAGS="$CFLAGS" yann@1: CFLAGS= yann@1: echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 yann@1: -echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5 yann@1: +echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2381,17 +2448,23 @@ yann@1: i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; yann@1: sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; yann@1: +sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: +sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: +alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; yann@1: ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; yann@1: m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; yann@1: +mips64*-*);; yann@1: +mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; yann@1: powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; yann@1: powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; yann@1: powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; yann@1: powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; yann@1: rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; yann@1: arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; yann@1: +s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; yann@1: +s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; yann@1: +x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; yann@1: +sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;; yann@1: esac yann@1: yann@1: if test $TARGETDIR = unknown; then yann@1: @@ -2418,6 +2491,15 @@ yann@1: fi yann@1: yann@1: yann@1: +if test x$TARGET = xMIPS_LINUX; then yann@1: + MIPS_LINUX_TRUE= yann@1: + MIPS_LINUX_FALSE='#' yann@1: +else yann@1: + MIPS_LINUX_TRUE='#' yann@1: + MIPS_LINUX_FALSE= yann@1: +fi yann@1: + yann@1: + yann@1: if test x$TARGET = xSPARC; then yann@1: SPARC_TRUE= yann@1: SPARC_FALSE='#' yann@1: @@ -2507,8 +2589,39 @@ yann@1: ARM_FALSE= yann@1: fi yann@1: yann@1: + yann@1: +if test x$TARGET = xS390; then yann@1: + S390_TRUE= yann@1: + S390_FALSE='#' yann@1: +else yann@1: + S390_TRUE='#' yann@1: + S390_FALSE= yann@1: +fi yann@1: + yann@1: + yann@1: +if test x$TARGET = xX86_64; then yann@1: + X86_64_TRUE= yann@1: + X86_64_FALSE='#' yann@1: +else yann@1: + X86_64_TRUE='#' yann@1: + X86_64_FALSE= yann@1: +fi yann@1: + yann@1: + yann@1: +if test x$TARGET = xSH; then yann@1: + SH_TRUE= yann@1: + SH_FALSE='#' yann@1: +else yann@1: + SH_TRUE='#' yann@1: + SH_FALSE= yann@1: +fi yann@1: + yann@1: +if test x$TARGET = xMIPS_LINUX; then yann@1: + TARGET=MIPS yann@1: +fi yann@1: + yann@1: echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 yann@1: -echo "configure:2512: checking how to run the C preprocessor" >&5 yann@1: +echo "configure:2625: checking how to run the C preprocessor" >&5 yann@1: # On Suns, sometimes $CPP names a directory. yann@1: if test -n "$CPP" && test -d "$CPP"; then yann@1: CPP= yann@1: @@ -2523,13 +2636,13 @@ yann@1: # On the NeXT, cc -E runs the code through the compiler's parser, yann@1: # not just through cpp. yann@1: cat > conftest.$ac_ext < yann@1: Syntax Error yann@1: EOF yann@1: ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" yann@1: -{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: +{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` yann@1: if test -z "$ac_err"; then yann@1: : yann@1: @@ -2540,13 +2653,13 @@ yann@1: rm -rf conftest* yann@1: CPP="${CC-cc} -E -traditional-cpp" yann@1: cat > conftest.$ac_ext < yann@1: Syntax Error yann@1: EOF yann@1: ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" yann@1: -{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: +{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` yann@1: if test -z "$ac_err"; then yann@1: : yann@1: @@ -2557,13 +2670,13 @@ yann@1: rm -rf conftest* yann@1: CPP="${CC-cc} -nologo -E" yann@1: cat > conftest.$ac_ext < yann@1: Syntax Error yann@1: EOF yann@1: ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" yann@1: -{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: +{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` yann@1: if test -z "$ac_err"; then yann@1: : yann@1: @@ -2588,12 +2701,12 @@ yann@1: echo "$ac_t""$CPP" 1>&6 yann@1: yann@1: echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 yann@1: -echo "configure:2592: checking for ANSI C header files" >&5 yann@1: +echo "configure:2705: checking for ANSI C header files" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext < yann@1: #include yann@1: @@ -2601,7 +2714,7 @@ yann@1: #include yann@1: EOF yann@1: ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" yann@1: -{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: +{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } yann@1: ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` yann@1: if test -z "$ac_err"; then yann@1: rm -rf conftest* yann@1: @@ -2618,7 +2731,7 @@ yann@1: if test $ac_cv_header_stdc = yes; then yann@1: # SunOS 4.x string.h does not declare mem*, contrary to ANSI. yann@1: cat > conftest.$ac_ext < yann@1: EOF yann@1: @@ -2636,7 +2749,7 @@ yann@1: if test $ac_cv_header_stdc = yes; then yann@1: # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. yann@1: cat > conftest.$ac_ext < yann@1: EOF yann@1: @@ -2657,7 +2770,7 @@ yann@1: : yann@1: else yann@1: cat > conftest.$ac_ext < yann@1: #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') yann@1: @@ -2668,7 +2781,7 @@ yann@1: exit (0); } yann@1: yann@1: EOF yann@1: -if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: +if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: then yann@1: : yann@1: else yann@1: @@ -2694,12 +2807,12 @@ yann@1: for ac_func in memcpy yann@1: do yann@1: echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 yann@1: -echo "configure:2698: checking for $ac_func" >&5 yann@1: +echo "configure:2811: checking for $ac_func" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: eval "ac_cv_func_$ac_func=yes" yann@1: else yann@1: @@ -2749,19 +2862,19 @@ yann@1: # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works yann@1: # for constant arguments. Useless! yann@1: echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 yann@1: -echo "configure:2753: checking for working alloca.h" >&5 yann@1: +echo "configure:2866: checking for working alloca.h" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext < yann@1: int main() { yann@1: char *p = alloca(2 * sizeof(int)); yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: ac_cv_header_alloca_h=yes yann@1: else yann@1: @@ -2782,12 +2895,12 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking for alloca""... $ac_c" 1>&6 yann@1: -echo "configure:2786: checking for alloca" >&5 yann@1: +echo "configure:2899: checking for alloca" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: ac_cv_func_alloca_works=yes yann@1: else yann@1: @@ -2847,12 +2960,12 @@ yann@1: yann@1: yann@1: echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 yann@1: -echo "configure:2851: checking whether alloca needs Cray hooks" >&5 yann@1: +echo "configure:2964: checking whether alloca needs Cray hooks" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext <&6 yann@1: -echo "configure:2881: checking for $ac_func" >&5 yann@1: +echo "configure:2994: checking for $ac_func" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: eval "ac_cv_func_$ac_func=yes" yann@1: else yann@1: @@ -2932,7 +3045,7 @@ yann@1: fi yann@1: yann@1: echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 yann@1: -echo "configure:2936: checking stack direction for C alloca" >&5 yann@1: +echo "configure:3049: checking stack direction for C alloca" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -2940,7 +3053,7 @@ yann@1: ac_cv_c_stack_direction=0 yann@1: else yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: +if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: then yann@1: ac_cv_c_stack_direction=1 yann@1: else yann@1: @@ -2982,13 +3095,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of short""... $ac_c" 1>&6 yann@1: -echo "configure:2986: checking size of short" >&5 yann@1: +echo "configure:3099: checking size of short" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -2998,7 +3111,7 @@ yann@1: switch (0) case 0: case (sizeof (short) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_short=$ac_size yann@1: else yann@1: @@ -3021,13 +3134,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of int""... $ac_c" 1>&6 yann@1: -echo "configure:3025: checking size of int" >&5 yann@1: +echo "configure:3138: checking size of int" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3037,7 +3150,7 @@ yann@1: switch (0) case 0: case (sizeof (int) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_int=$ac_size yann@1: else yann@1: @@ -3060,13 +3173,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of long""... $ac_c" 1>&6 yann@1: -echo "configure:3064: checking size of long" >&5 yann@1: +echo "configure:3177: checking size of long" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3076,7 +3189,7 @@ yann@1: switch (0) case 0: case (sizeof (long) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_long=$ac_size yann@1: else yann@1: @@ -3099,13 +3212,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of long long""... $ac_c" 1>&6 yann@1: -echo "configure:3103: checking size of long long" >&5 yann@1: +echo "configure:3216: checking size of long long" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3115,7 +3228,7 @@ yann@1: switch (0) case 0: case (sizeof (long long) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_long_long=$ac_size yann@1: else yann@1: @@ -3138,13 +3251,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of float""... $ac_c" 1>&6 yann@1: -echo "configure:3142: checking size of float" >&5 yann@1: +echo "configure:3255: checking size of float" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3154,7 +3267,7 @@ yann@1: switch (0) case 0: case (sizeof (float) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_float=$ac_size yann@1: else yann@1: @@ -3177,13 +3290,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of double""... $ac_c" 1>&6 yann@1: -echo "configure:3181: checking size of double" >&5 yann@1: +echo "configure:3294: checking size of double" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3193,7 +3306,7 @@ yann@1: switch (0) case 0: case (sizeof (double) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_double=$ac_size yann@1: else yann@1: @@ -3216,13 +3329,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of long double""... $ac_c" 1>&6 yann@1: -echo "configure:3220: checking size of long double" >&5 yann@1: +echo "configure:3333: checking size of long double" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3232,7 +3345,7 @@ yann@1: switch (0) case 0: case (sizeof (long double) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_long_double=$ac_size yann@1: else yann@1: @@ -3256,13 +3369,13 @@ yann@1: yann@1: yann@1: echo $ac_n "checking size of void *""... $ac_c" 1>&6 yann@1: -echo "configure:3260: checking size of void *" >&5 yann@1: +echo "configure:3373: checking size of void *" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. yann@1: cat > conftest.$ac_ext < yann@1: @@ -3272,7 +3385,7 @@ yann@1: switch (0) case 0: case (sizeof (void *) == $ac_size):; yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_sizeof_void_p=$ac_size yann@1: else yann@1: @@ -3295,14 +3408,14 @@ yann@1: yann@1: yann@1: echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 yann@1: -echo "configure:3299: checking whether byte ordering is bigendian" >&5 yann@1: +echo "configure:3412: checking whether byte ordering is bigendian" >&5 yann@1: if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: ac_cv_c_bigendian=unknown yann@1: # See if sys/param.h defines the BYTE_ORDER macro. yann@1: cat > conftest.$ac_ext < yann@1: #include yann@1: @@ -3313,11 +3426,11 @@ yann@1: #endif yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: # It does; now see whether it defined to BIG_ENDIAN or not. yann@1: cat > conftest.$ac_ext < yann@1: #include yann@1: @@ -3328,7 +3441,7 @@ yann@1: #endif yann@1: ; return 0; } yann@1: EOF yann@1: -if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: +if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then yann@1: rm -rf conftest* yann@1: ac_cv_c_bigendian=yes yann@1: else yann@1: @@ -3348,7 +3461,7 @@ yann@1: echo $ac_n "cross-compiling... " 2>&6 yann@1: else yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: +if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null yann@1: then yann@1: ac_cv_c_bigendian=no yann@1: else yann@1: @@ -3379,7 +3492,7 @@ yann@1: echo "$ac_t""$ac_cv_c_bigendian" 1>&6 yann@1: if test $ac_cv_c_bigendian = unknown; then yann@1: echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6 yann@1: -echo "configure:3383: checking to probe for byte ordering" >&5 yann@1: +echo "configure:3496: checking to probe for byte ordering" >&5 yann@1: yann@1: cat >conftest.c <> confdefs.h <<\EOF yann@1: +#define HOST_WORDS_BIG_ENDIAN 1 yann@1: +EOF yann@1: + yann@1: BYTEORDER=4321 yann@1: else yann@1: BYTEORDER=1234 yann@1: @@ -3429,7 +3546,7 @@ yann@1: yann@1: if test x$TARGET = xSPARC; then yann@1: echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6 yann@1: -echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5 yann@1: +echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5 yann@1: if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then yann@1: echo $ac_n "(cached) $ac_c" 1>&6 yann@1: else yann@1: @@ -3439,14 +3556,14 @@ yann@1: CFLAGS="$CFLAGS -fpic" yann@1: LDFLAGS="$LDFLAGS -shared" yann@1: cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: +if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then yann@1: rm -rf conftest* yann@1: libffi_cv_as_sparc_ua_pcrel=yes yann@1: else yann@1: @@ -3709,6 +3826,8 @@ yann@1: s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g yann@1: s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g yann@1: s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g yann@1: +s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g yann@1: +s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g yann@1: s%@SPARC_TRUE@%$SPARC_TRUE%g yann@1: s%@SPARC_FALSE@%$SPARC_FALSE%g yann@1: s%@X86_TRUE@%$X86_TRUE%g yann@1: @@ -3729,6 +3848,12 @@ yann@1: s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g yann@1: s%@ARM_TRUE@%$ARM_TRUE%g yann@1: s%@ARM_FALSE@%$ARM_FALSE%g yann@1: +s%@S390_TRUE@%$S390_TRUE%g yann@1: +s%@S390_FALSE@%$S390_FALSE%g yann@1: +s%@X86_64_TRUE@%$X86_64_TRUE%g yann@1: +s%@X86_64_FALSE@%$X86_64_FALSE%g yann@1: +s%@SH_TRUE@%$SH_TRUE%g yann@1: +s%@SH_FALSE@%$SH_FALSE%g yann@1: s%@CPP@%$CPP%g yann@1: s%@ALLOCA@%$ALLOCA%g yann@1: s%@TARGET@%$TARGET%g yann@1: @@ -3969,7 +4094,7 @@ yann@1: yann@1: if test -n "$CONFIG_FILES"; then yann@1: LD="${ORIGINAL_LD_FOR_MULTILIBS}" yann@1: - ac_file=Makefile . ${libffi_basedir}/../config-ml.in yann@1: + ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in yann@1: fi yann@1: yann@1: exit 0 yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in yann@1: --- gcc-3.2.2.orig/libffi/configure.in Tue Jan 28 10:43:56 2003 yann@1: +++ gcc/libffi/configure.in Sat Feb 1 20:16:19 2003 yann@1: @@ -22,14 +22,15 @@ yann@1: yann@1: if test "${srcdir}" = "."; then yann@1: if test "${with_target_subdir}" != "."; then yann@1: - libffi_basedir="${srcdir}/${with_multisrctop}.." yann@1: + libffi_basedir="${with_multisrctop}../" yann@1: else yann@1: - libffi_basedir="${srcdir}/${with_multisrctop}" yann@1: + libffi_basedir="${with_multisrctop}" yann@1: fi yann@1: else yann@1: - libffi_basedir="${srcdir}" yann@1: + libffi_basedir= yann@1: fi yann@1: AC_SUBST(libffi_basedir) yann@1: +AC_CONFIG_AUX_DIR(${libffi_basedir}..) yann@1: yann@1: AC_CANONICAL_HOST yann@1: yann@1: @@ -56,17 +57,23 @@ yann@1: i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; yann@1: sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: -alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; yann@1: +sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: +sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; yann@1: +alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; yann@1: ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; yann@1: m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; yann@1: +mips64*-*);; yann@1: +mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; yann@1: powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; yann@1: powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; yann@1: powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; yann@1: powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; yann@1: rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; yann@1: arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; yann@1: +s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; yann@1: +s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; yann@1: +x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; yann@1: +sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;; yann@1: esac yann@1: yann@1: if test $TARGETDIR = unknown; then yann@1: @@ -75,6 +82,7 @@ yann@1: yann@1: AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes) yann@1: AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno) yann@1: +AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX) yann@1: AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) yann@1: AM_CONDITIONAL(X86, test x$TARGET = xX86) yann@1: AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32) yann@1: @@ -85,6 +93,13 @@ yann@1: AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) yann@1: AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) yann@1: AM_CONDITIONAL(ARM, test x$TARGET = xARM) yann@1: +AM_CONDITIONAL(S390, test x$TARGET = xS390) yann@1: +AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) yann@1: +AM_CONDITIONAL(SH, test x$TARGET = xSH) yann@1: + yann@1: +if test x$TARGET = xMIPS_LINUX; then yann@1: + TARGET=MIPS yann@1: +fi yann@1: yann@1: AC_HEADER_STDC yann@1: AC_CHECK_FUNCS(memcpy) yann@1: @@ -171,7 +186,7 @@ yann@1: [ yann@1: if test -n "$CONFIG_FILES"; then yann@1: LD="${ORIGINAL_LD_FOR_MULTILIBS}" yann@1: - ac_file=Makefile . ${libffi_basedir}/../config-ml.in yann@1: + ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in yann@1: fi yann@1: ], yann@1: srcdir=${srcdir} yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in yann@1: --- gcc-3.2.2.orig/libffi/include/Makefile.in Tue Oct 9 14:32:16 2001 yann@1: +++ gcc/libffi/include/Makefile.in Mon Apr 29 13:14:44 2002 yann@1: @@ -99,7 +99,7 @@ yann@1: yann@1: DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) yann@1: yann@1: -TAR = gnutar yann@1: +TAR = gtar yann@1: GZIP_ENV = --best yann@1: all: all-redirect yann@1: .SUFFIXES: yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in yann@1: --- gcc-3.2.2.orig/libffi/include/ffi.h.in Wed Mar 13 07:35:56 2002 yann@1: +++ gcc/libffi/include/ffi.h.in Wed Jan 29 00:54:28 2003 yann@1: @@ -1,5 +1,5 @@ yann@1: /* -----------------------------------------------------------------*-C-*- yann@1: - libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions yann@1: + libffi @VERSION@ - Copyright (c) 1996-2003 Cygnus Solutions yann@1: yann@1: Permission is hereby granted, free of charge, to any person obtaining yann@1: a copy of this software and associated documentation files (the yann@1: @@ -164,6 +164,12 @@ yann@1: #endif yann@1: #endif yann@1: yann@1: +#ifdef S390 yann@1: +#if defined (__s390x__) yann@1: +#define S390X yann@1: +#endif yann@1: +#endif yann@1: + yann@1: #ifndef LIBFFI_ASM yann@1: yann@1: /* ---- Generic type definitions ----------------------------------------- */ yann@1: @@ -189,16 +195,23 @@ yann@1: #endif yann@1: #endif yann@1: yann@1: - /* ---- Intel x86 ---------------- */ yann@1: -#ifdef X86 yann@1: + /* ---- Intel x86 Win32 ---------- */ yann@1: +#ifdef X86_WIN32 yann@1: FFI_SYSV, yann@1: + FFI_STDCALL, yann@1: + /* TODO: Add fastcall support for the sake of completeness */ yann@1: FFI_DEFAULT_ABI = FFI_SYSV, yann@1: #endif yann@1: yann@1: - /* ---- Intel x86 Win32 ---------- */ yann@1: -#ifdef X86_WIN32 yann@1: + /* ---- Intel x86 and AMD x86-64 - */ yann@1: +#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) yann@1: FFI_SYSV, yann@1: + FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ yann@1: +#ifdef __i386__ yann@1: FFI_DEFAULT_ABI = FFI_SYSV, yann@1: +#else yann@1: + FFI_DEFAULT_ABI = FFI_UNIX64, yann@1: +#endif yann@1: #endif yann@1: yann@1: /* ---- Intel ia64 ---------------- */ yann@1: @@ -251,6 +264,18 @@ yann@1: FFI_DEFAULT_ABI = FFI_SYSV, yann@1: #endif yann@1: yann@1: + /* ---- S390 --------------------- */ yann@1: +#ifdef S390 yann@1: + FFI_SYSV, yann@1: + FFI_DEFAULT_ABI = FFI_SYSV, yann@1: +#endif yann@1: + yann@1: + /* ---- SuperH ------------------- */ yann@1: +#ifdef SH yann@1: + FFI_SYSV, yann@1: + FFI_DEFAULT_ABI = FFI_SYSV, yann@1: +#endif yann@1: + yann@1: /* Leave this for debugging purposes */ yann@1: FFI_LAST_ABI yann@1: yann@1: @@ -264,7 +289,7 @@ yann@1: /*@null@*/ struct _ffi_type **elements; yann@1: } ffi_type; yann@1: yann@1: -/* These are defined in ffi.c */ yann@1: +/* These are defined in types.c */ yann@1: extern ffi_type ffi_type_void; yann@1: extern ffi_type ffi_type_uint8; yann@1: extern ffi_type ffi_type_sint8; yann@1: @@ -373,13 +398,7 @@ yann@1: yann@1: /* ---- Definitions for closures ----------------------------------------- */ yann@1: yann@1: -#ifdef X86 yann@1: - yann@1: -#define FFI_CLOSURES 1 /* x86 supports closures */ yann@1: -#define FFI_TRAMPOLINE_SIZE 10 yann@1: -#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */ yann@1: - yann@1: -#elif defined(X86_WIN32) yann@1: +#ifdef __i386__ yann@1: yann@1: #define FFI_CLOSURES 1 /* x86 supports closures */ yann@1: #define FFI_TRAMPOLINE_SIZE 10 yann@1: @@ -424,6 +443,40 @@ yann@1: #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ yann@1: #define FFI_NATIVE_RAW_API 0 yann@1: yann@1: +#elif defined(SPARC64) yann@1: + yann@1: +#define FFI_CLOSURES 1 yann@1: +#define FFI_TRAMPOLINE_SIZE 24 yann@1: +#define FFI_NATIVE_RAW_API 0 yann@1: + yann@1: +#elif defined(SPARC) yann@1: + yann@1: +#define FFI_CLOSURES 1 yann@1: +#define FFI_TRAMPOLINE_SIZE 16 yann@1: +#define FFI_NATIVE_RAW_API 0 yann@1: + yann@1: +#elif defined(S390) yann@1: + yann@1: +#define FFI_CLOSURES 1 yann@1: +#ifdef S390X yann@1: +#define FFI_TRAMPOLINE_SIZE 32 yann@1: +#else yann@1: +#define FFI_TRAMPOLINE_SIZE 16 yann@1: +#endif yann@1: +#define FFI_NATIVE_RAW_API 0 yann@1: + yann@1: +#elif defined(SH) yann@1: + yann@1: +#define FFI_CLOSURES 1 yann@1: +#define FFI_TRAMPOLINE_SIZE 16 yann@1: +#define FFI_NATIVE_RAW_API 0 yann@1: + yann@1: +#elif defined(__x86_64__) yann@1: + yann@1: +#define FFI_CLOSURES 1 yann@1: +#define FFI_TRAMPOLINE_SIZE 24 yann@1: +#define FFI_NATIVE_RAW_API 0 yann@1: + yann@1: #else yann@1: yann@1: #define FFI_CLOSURES 0 yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/arm/ffi.c Sat Mar 3 07:21:23 2001 yann@1: +++ gcc/libffi/src/arm/ffi.c Fri Jul 19 08:08:30 2002 yann@1: @@ -36,13 +36,10 @@ yann@1: /*@=exportheader@*/ yann@1: { yann@1: register unsigned int i; yann@1: - register int tmp; yann@1: - register unsigned int avn; yann@1: register void **p_argv; yann@1: register char *argp; yann@1: register ffi_type **p_arg; yann@1: yann@1: - tmp = 0; yann@1: argp = stack; yann@1: yann@1: if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) { yann@1: @@ -50,11 +47,10 @@ yann@1: argp += 4; yann@1: } yann@1: yann@1: - avn = ecif->cif->nargs; yann@1: p_argv = ecif->avalue; yann@1: yann@1: for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; yann@1: - (i != 0) && (avn != 0); yann@1: + (i != 0); yann@1: i--, p_arg++) yann@1: { yann@1: size_t z; yann@1: @@ -64,9 +60,6 @@ yann@1: argp = (char *) ALIGN(argp, (*p_arg)->alignment); yann@1: } yann@1: yann@1: - if (avn != 0) yann@1: - { yann@1: - avn--; yann@1: z = (*p_arg)->size; yann@1: if (z < sizeof(int)) yann@1: { yann@1: @@ -107,7 +100,6 @@ yann@1: } yann@1: p_argv++; yann@1: argp += z; yann@1: - } yann@1: } yann@1: yann@1: return; yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S yann@1: --- gcc-3.2.2.orig/libffi/src/arm/sysv.S Sat Mar 3 07:21:23 2001 yann@1: +++ gcc/libffi/src/arm/sysv.S Mon Sep 30 03:08:58 2002 yann@1: @@ -28,8 +28,15 @@ yann@1: #ifdef HAVE_MACHINE_ASM_H yann@1: #include yann@1: #else yann@1: -/* XXX these lose for some platforms, I'm sure. */ yann@1: +#ifdef __USER_LABEL_PREFIX__ yann@1: +#define CONCAT1(a, b) CONCAT2(a, b) yann@1: +#define CONCAT2(a, b) a ## b yann@1: + yann@1: +/* Use the right prefix for global labels. */ yann@1: +#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) yann@1: +#else yann@1: #define CNAME(x) x yann@1: +#endif yann@1: #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): yann@1: #endif yann@1: yann@1: @@ -96,12 +103,20 @@ yann@1: yann@1: # return FLOAT yann@1: cmp a4, #FFI_TYPE_FLOAT yann@1: +#ifdef __SOFTFP__ yann@1: + streq a1, [a3] yann@1: +#else yann@1: stfeqs f0, [a3] yann@1: +#endif yann@1: beq epilogue yann@1: yann@1: # return DOUBLE or LONGDOUBLE yann@1: cmp a4, #FFI_TYPE_DOUBLE yann@1: +#ifdef __SOFTFP__ yann@1: + stmeqia a3, {a1, a2} yann@1: +#else yann@1: stfeqd f0, [a3] yann@1: +#endif yann@1: yann@1: epilogue: yann@1: ldmfd sp!, {a1-a4, fp, pc} yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c yann@1: --- gcc-3.2.2.orig/libffi/src/java_raw_api.c Tue Apr 9 07:31:14 2002 yann@1: +++ gcc/libffi/src/java_raw_api.c Tue Oct 8 23:55:02 2002 yann@1: @@ -81,21 +81,14 @@ yann@1: { yann@1: case FFI_TYPE_UINT8: yann@1: case FFI_TYPE_SINT8: yann@1: - *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1); yann@1: + *args = (void*) ((char*)(raw++) + 3); yann@1: break; yann@1: yann@1: case FFI_TYPE_UINT16: yann@1: case FFI_TYPE_SINT16: yann@1: - *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2); yann@1: + *args = (void*) ((char*)(raw++) + 2); yann@1: break; yann@1: yann@1: -#if SIZEOF_ARG >= 4 yann@1: - case FFI_TYPE_UINT32: yann@1: - case FFI_TYPE_SINT32: yann@1: - *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4); yann@1: - break; yann@1: -#endif yann@1: - yann@1: #if SIZEOF_ARG == 8 yann@1: case FFI_TYPE_UINT64: yann@1: case FFI_TYPE_SINT64: yann@1: @@ -157,31 +150,54 @@ yann@1: switch ((*tp)->type) yann@1: { yann@1: case FFI_TYPE_UINT8: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(UINT32*)(raw++) = *(UINT8*) (*args); yann@1: +#else yann@1: (raw++)->uint = *(UINT8*) (*args); yann@1: +#endif yann@1: break; yann@1: yann@1: case FFI_TYPE_SINT8: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(SINT32*)(raw++) = *(SINT8*) (*args); yann@1: +#else yann@1: (raw++)->sint = *(SINT8*) (*args); yann@1: +#endif yann@1: break; yann@1: yann@1: case FFI_TYPE_UINT16: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(UINT32*)(raw++) = *(UINT16*) (*args); yann@1: +#else yann@1: (raw++)->uint = *(UINT16*) (*args); yann@1: +#endif yann@1: break; yann@1: yann@1: case FFI_TYPE_SINT16: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(SINT32*)(raw++) = *(SINT16*) (*args); yann@1: +#else yann@1: (raw++)->sint = *(SINT16*) (*args); yann@1: +#endif yann@1: break; yann@1: yann@1: -#if SIZEOF_ARG >= 4 yann@1: case FFI_TYPE_UINT32: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(UINT32*)(raw++) = *(UINT32*) (*args); yann@1: +#else yann@1: (raw++)->uint = *(UINT32*) (*args); yann@1: +#endif yann@1: break; yann@1: yann@1: case FFI_TYPE_SINT32: yann@1: +#if WORDS_BIGENDIAN yann@1: + *(SINT32*)(raw++) = *(SINT32*) (*args); yann@1: +#else yann@1: (raw++)->sint = *(SINT32*) (*args); yann@1: - break; yann@1: #endif yann@1: - case FFI_TYPE_FLOAT: yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: (raw++)->flt = *(FLOAT32*) (*args); yann@1: break; yann@1: yann@1: @@ -211,6 +227,55 @@ yann@1: yann@1: #if !FFI_NATIVE_RAW_API yann@1: yann@1: +static void yann@1: +ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) yann@1: +{ yann@1: +#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 yann@1: + switch (cif->rtype->type) yann@1: + { yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_UINT32: yann@1: + *(UINT64 *)rvalue <<= 32; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_INT: yann@1: + *(SINT64 *)rvalue <<= 32; yann@1: + break; yann@1: + yann@1: + default: yann@1: + break; yann@1: + } yann@1: +#endif yann@1: +} yann@1: + yann@1: +static void yann@1: +ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) yann@1: +{ yann@1: +#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 yann@1: + switch (cif->rtype->type) yann@1: + { yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_UINT32: yann@1: + *(UINT64 *)rvalue >>= 32; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_INT: yann@1: + *(SINT64 *)rvalue >>= 32; yann@1: + break; yann@1: + yann@1: + default: yann@1: + break; yann@1: + } yann@1: +#endif yann@1: +} yann@1: yann@1: /* This is a generic definition of ffi_raw_call, to be used if the yann@1: * native system does not provide a machine-specific implementation. yann@1: @@ -227,6 +292,7 @@ yann@1: void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); yann@1: ffi_java_raw_to_ptrarray (cif, raw, avalue); yann@1: ffi_call (cif, fn, rvalue, avalue); yann@1: + ffi_java_rvalue_to_raw (cif, rvalue); yann@1: } yann@1: yann@1: #if FFI_CLOSURES /* base system provides closures */ yann@1: @@ -240,6 +306,7 @@ yann@1: yann@1: ffi_java_ptrarray_to_raw (cif, avalue, raw); yann@1: (*cl->fun) (cif, rvalue, raw, cl->user_data); yann@1: + ffi_java_raw_to_rvalue (cif, rvalue); yann@1: } yann@1: yann@1: /* Again, here is the generic version of ffi_prep_raw_closure, which yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/m68k/ffi.c Sun Aug 8 22:27:19 1999 yann@1: +++ gcc/libffi/src/m68k/ffi.c Fri Jul 19 08:08:30 2002 yann@1: @@ -16,14 +16,11 @@ yann@1: ffi_prep_args (void *stack, extended_cif *ecif) yann@1: { yann@1: unsigned int i; yann@1: - int tmp; yann@1: - unsigned int avn; yann@1: void **p_argv; yann@1: char *argp; yann@1: ffi_type **p_arg; yann@1: void *struct_value_ptr; yann@1: yann@1: - tmp = 0; yann@1: argp = stack; yann@1: yann@1: if (ecif->cif->rtype->type == FFI_TYPE_STRUCT yann@1: @@ -32,11 +29,10 @@ yann@1: else yann@1: struct_value_ptr = NULL; yann@1: yann@1: - avn = ecif->cif->nargs; yann@1: p_argv = ecif->avalue; yann@1: yann@1: for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; yann@1: - i != 0 && avn != 0; yann@1: + i != 0; yann@1: i--, p_arg++) yann@1: { yann@1: size_t z; yann@1: @@ -45,9 +41,6 @@ yann@1: if (((*p_arg)->alignment - 1) & (unsigned) argp) yann@1: argp = (char *) ALIGN (argp, (*p_arg)->alignment); yann@1: yann@1: - if (avn != 0) yann@1: - { yann@1: - avn--; yann@1: z = (*p_arg)->size; yann@1: if (z < sizeof (int)) yann@1: { yann@1: @@ -82,7 +75,6 @@ yann@1: memcpy (argp, *p_argv, z); yann@1: p_argv++; yann@1: argp += z; yann@1: - } yann@1: } yann@1: yann@1: return struct_value_ptr; yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/mips/ffi.c Sat Mar 3 07:21:23 2001 yann@1: +++ gcc/libffi/src/mips/ffi.c Fri Jul 19 08:08:31 2002 yann@1: @@ -23,6 +23,7 @@ yann@1: OTHER DEALINGS IN THE SOFTWARE. yann@1: ----------------------------------------------------------------------- */ yann@1: yann@1: +#include yann@1: #include yann@1: #include yann@1: yann@1: @@ -50,7 +51,6 @@ yann@1: int flags) yann@1: { yann@1: register int i; yann@1: - register int avn; yann@1: register void **p_argv; yann@1: register char *argp; yann@1: register ffi_type **p_arg; yann@1: @@ -80,12 +80,9 @@ yann@1: FIX_ARGP; yann@1: } yann@1: yann@1: - avn = ecif->cif->nargs; yann@1: p_argv = ecif->avalue; yann@1: yann@1: - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; yann@1: - i && avn; yann@1: - i--, p_arg++) yann@1: + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) yann@1: { yann@1: size_t z; yann@1: yann@1: @@ -101,9 +98,6 @@ yann@1: #define OFFSET sizeof(int) yann@1: #endif yann@1: yann@1: - if (avn) yann@1: - { yann@1: - avn--; yann@1: z = (*p_arg)->size; yann@1: if (z < sizeof(SLOT_TYPE_UNSIGNED)) yann@1: { yann@1: @@ -179,7 +173,6 @@ yann@1: p_argv++; yann@1: argp += z; yann@1: FIX_ARGP; yann@1: - } yann@1: } yann@1: yann@1: return; yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S yann@1: --- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S Sat Jan 19 01:22:34 2002 yann@1: +++ gcc/libffi/src/powerpc/darwin.S Thu Jan 23 03:21:55 2003 yann@1: @@ -3,8 +3,6 @@ yann@1: yann@1: PowerPC Assembly glue. yann@1: yann@1: - $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $ yann@1: - yann@1: Permission is hereby granted, free of charge, to any person obtaining yann@1: a copy of this software and associated documentation files (the yann@1: ``Software''), to deal in the Software without restriction, including yann@1: @@ -39,30 +37,34 @@ yann@1: .text yann@1: .align 2 yann@1: _ffi_call_DARWIN: yann@1: - mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved... yann@1: +LFB0: yann@1: + mr r12,r8 /* We only need r12 until the call, yann@1: + so it doesn't have to be saved... */ yann@1: +LFB1: yann@1: /* Save the old stack pointer as AP. */ yann@1: mr r8,r1 yann@1: - yann@1: +LCFI0: yann@1: /* Allocate the stack space we need. */ yann@1: stwux r1,r1,r4 yann@1: yann@1: /* Save registers we use. */ yann@1: mflr r9 yann@1: yann@1: - stw r28,-16(r8) yann@1: + stw r28,-16(r8) yann@1: stw r29,-12(r8) yann@1: stw r30, -8(r8) yann@1: stw r31, -4(r8) yann@1: - yann@1: - stw r9, 8(r8) yann@1: + yann@1: + stw r9, 8(r8) yann@1: stw r2, 20(r1) yann@1: +LCFI1: yann@1: yann@1: /* Save arguments over call... */ yann@1: - mr r31,r5 /* flags, */ yann@1: - mr r30,r6 /* rvalue, */ yann@1: - mr r29,r7 /* function address, */ yann@1: - mr r28,r8 /* our AP. */ yann@1: - yann@1: + mr r31,r5 /* flags, */ yann@1: + mr r30,r6 /* rvalue, */ yann@1: + mr r29,r7 /* function address, */ yann@1: + mr r28,r8 /* our AP. */ yann@1: +LCFI2: yann@1: /* Call ffi_prep_args. */ yann@1: mr r4,r1 yann@1: li r9,0 yann@1: @@ -145,7 +147,8 @@ yann@1: L(float_return_value): yann@1: stfs f1,0(r30) yann@1: b L(done_return_value) yann@1: -//END(_ffi_call_DARWIN) yann@1: +LFE1: yann@1: +/* END(_ffi_call_DARWIN) */ yann@1: yann@1: /* Provide a null definition of _ffi_call_AIX. */ yann@1: .text yann@1: @@ -155,5 +158,61 @@ yann@1: .align 2 yann@1: _ffi_call_AIX: yann@1: blr yann@1: -//END(_ffi_call_AIX) yann@1: +/* END(_ffi_call_AIX) */ yann@1: yann@1: +.data yann@1: +.section __TEXT,__eh_frame yann@1: +Lframe1: yann@1: + .set L$set$0,LECIE1-LSCIE1 yann@1: + .long L$set$0 ; Length of Common Information Entry yann@1: +LSCIE1: yann@1: + .long 0x0 ; CIE Identifier Tag yann@1: + .byte 0x1 ; CIE Version yann@1: + .ascii "zR\0" ; CIE Augmentation yann@1: + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor yann@1: + .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor yann@1: + .byte 0x41 ; CIE RA Column yann@1: + .byte 0x1 ; uleb128 0x1; Augmentation size yann@1: + .byte 0x10 ; FDE Encoding (pcrel) yann@1: + .byte 0xc ; DW_CFA_def_cfa yann@1: + .byte 0x1 ; uleb128 0x1 yann@1: + .byte 0x0 ; uleb128 0x0 yann@1: + .align 2 yann@1: +LECIE1: yann@1: +LSFDE1: yann@1: + .set L$set$1,LEFDE1-LASFDE1 yann@1: + .long L$set$1 ; FDE Length yann@1: +LASFDE1: yann@1: + .set L$set$2,LASFDE1-Lframe1 yann@1: + .long L$set$2 ; FDE CIE offset yann@1: + .long LFB0-. ; FDE initial location yann@1: + .set L$set$3,LFE1-LFB0 yann@1: + .long L$set$3 ; FDE address range yann@1: + .byte 0x0 ; uleb128 0x0; Augmentation size yann@1: + .byte 0x4 ; DW_CFA_advance_loc4 yann@1: + .set L$set$4,LCFI0-LFB1 yann@1: + .long L$set$4 yann@1: + .byte 0xd ; DW_CFA_def_cfa_register yann@1: + .byte 0x08 ; uleb128 0x08 yann@1: + .byte 0x4 ; DW_CFA_advance_loc4 yann@1: + .set L$set$5,LCFI1-LCFI0 yann@1: + .long L$set$5 yann@1: + .byte 0x11 ; DW_CFA_offset_extended_sf yann@1: + .byte 0x41 ; uleb128 0x41 yann@1: + .byte 0x7e ; sleb128 -2 yann@1: + .byte 0x9f ; DW_CFA_offset, column 0x1f yann@1: + .byte 0x1 ; uleb128 0x1 yann@1: + .byte 0x9e ; DW_CFA_offset, column 0x1e yann@1: + .byte 0x2 ; uleb128 0x2 yann@1: + .byte 0x9d ; DW_CFA_offset, column 0x1d yann@1: + .byte 0x3 ; uleb128 0x3 yann@1: + .byte 0x9c ; DW_CFA_offset, column 0x1c yann@1: + .byte 0x4 ; uleb128 0x4 yann@1: + .byte 0x4 ; DW_CFA_advance_loc4 yann@1: + .set L$set$6,LCFI2-LCFI1 yann@1: + .long L$set$6 yann@1: + .byte 0xd ; DW_CFA_def_cfa_register yann@1: + .byte 0x1c ; uleb128 0x1c yann@1: + .align 2 yann@1: +LEFDE1: yann@1: + yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c yann@1: --- gcc-3.2.2.orig/libffi/src/prep_cif.c Sat Mar 3 07:21:22 2001 yann@1: +++ gcc/libffi/src/prep_cif.c Mon Sep 30 20:59:42 2002 yann@1: @@ -103,7 +103,8 @@ yann@1: /* Perform a sanity check on the return type */ yann@1: FFI_ASSERT(ffi_type_test(cif->rtype)); yann@1: yann@1: -#ifndef M68K yann@1: + /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ yann@1: +#if !defined M68K && !defined __x86_64__ && !defined S390 yann@1: /* Make space for the return structure pointer */ yann@1: if (cif->rtype->type == FFI_TYPE_STRUCT yann@1: #ifdef SPARC yann@1: @@ -122,6 +123,7 @@ yann@1: if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) yann@1: return FFI_BAD_TYPEDEF; yann@1: yann@1: +#if !defined __x86_64__ && !defined S390 yann@1: #ifdef SPARC yann@1: if (((*ptr)->type == FFI_TYPE_STRUCT yann@1: && ((*ptr)->size > 16 || cif->abi != FFI_V9)) yann@1: @@ -137,6 +139,7 @@ yann@1: yann@1: bytes += STACK_ARG_SIZE((*ptr)->size); yann@1: } yann@1: +#endif yann@1: } yann@1: yann@1: cif->bytes = bytes; yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/s390/ffi.c Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/s390/ffi.c Thu Feb 6 08:58:57 2003 yann@1: @@ -0,0 +1,753 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + ffi.c - Copyright (c) 2000 Software AG yann@1: + yann@1: + S390 Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: +/*====================================================================*/ yann@1: +/* Includes */ yann@1: +/* -------- */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +#include yann@1: +#include yann@1: + yann@1: +#include yann@1: +#include yann@1: + yann@1: +/*====================== End of Includes =============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* Defines */ yann@1: +/* ------- */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +/* Maximum number of GPRs available for argument passing. */ yann@1: +#define MAX_GPRARGS 5 yann@1: + yann@1: +/* Maximum number of FPRs available for argument passing. */ yann@1: +#ifdef __s390x__ yann@1: +#define MAX_FPRARGS 4 yann@1: +#else yann@1: +#define MAX_FPRARGS 2 yann@1: +#endif yann@1: + yann@1: +/* Round to multiple of 16. */ yann@1: +#define ROUND_SIZE(size) (((size) + 15) & ~15) yann@1: + yann@1: +/* If these values change, sysv.S must be adapted! */ yann@1: +#define FFI390_RET_VOID 0 yann@1: +#define FFI390_RET_STRUCT 1 yann@1: +#define FFI390_RET_FLOAT 2 yann@1: +#define FFI390_RET_DOUBLE 3 yann@1: +#define FFI390_RET_INT32 4 yann@1: +#define FFI390_RET_INT64 5 yann@1: + yann@1: +/*===================== End of Defines ===============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* Prototypes */ yann@1: +/* ---------- */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +static void ffi_prep_args (unsigned char *, extended_cif *); yann@1: +static int ffi_check_float_struct (ffi_type *); yann@1: +void yann@1: +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) yann@1: +__attribute__ ((visibility ("hidden"))) yann@1: +#endif yann@1: +ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, yann@1: + unsigned long long *, unsigned long *); yann@1: + yann@1: +/*====================== End of Prototypes ===========================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* Externals */ yann@1: +/* --------- */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +extern void ffi_call_SYSV(unsigned, yann@1: + extended_cif *, yann@1: + void (*)(unsigned char *, extended_cif *), yann@1: + unsigned, yann@1: + void *, yann@1: + void (*fn)()); yann@1: + yann@1: +extern void ffi_closure_SYSV(void); yann@1: + yann@1: +/*====================== End of Externals ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_check_struct_type. */ yann@1: +/* */ yann@1: +/* Function - Determine if a structure can be passed within a */ yann@1: +/* general purpose or floating point register. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +static int yann@1: +ffi_check_struct_type (ffi_type *arg) yann@1: +{ yann@1: + size_t size = arg->size; yann@1: + yann@1: + /* If the struct has just one element, look at that element yann@1: + to find out whether to consider the struct as floating point. */ yann@1: + while (arg->type == FFI_TYPE_STRUCT yann@1: + && arg->elements[0] && !arg->elements[1]) yann@1: + arg = arg->elements[0]; yann@1: + yann@1: + /* Structs of size 1, 2, 4, and 8 are passed in registers, yann@1: + just like the corresponding int/float types. */ yann@1: + switch (size) yann@1: + { yann@1: + case 1: yann@1: + return FFI_TYPE_UINT8; yann@1: + yann@1: + case 2: yann@1: + return FFI_TYPE_UINT16; yann@1: + yann@1: + case 4: yann@1: + if (arg->type == FFI_TYPE_FLOAT) yann@1: + return FFI_TYPE_FLOAT; yann@1: + else yann@1: + return FFI_TYPE_UINT32; yann@1: + yann@1: + case 8: yann@1: + if (arg->type == FFI_TYPE_DOUBLE) yann@1: + return FFI_TYPE_DOUBLE; yann@1: + else yann@1: + return FFI_TYPE_UINT64; yann@1: + yann@1: + default: yann@1: + break; yann@1: + } yann@1: + yann@1: + /* Other structs are passed via a pointer to the data. */ yann@1: + return FFI_TYPE_POINTER; yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_prep_args. */ yann@1: +/* */ yann@1: +/* Function - Prepare parameters for call to function. */ yann@1: +/* */ yann@1: +/* ffi_prep_args is called by the assembly routine once stack space */ yann@1: +/* has been allocated for the function's arguments. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +static void yann@1: +ffi_prep_args (unsigned char *stack, extended_cif *ecif) yann@1: +{ yann@1: + /* The stack space will be filled with those areas: yann@1: + yann@1: + FPR argument register save area (highest addresses) yann@1: + GPR argument register save area yann@1: + temporary struct copies yann@1: + overflow argument area (lowest addresses) yann@1: + yann@1: + We set up the following pointers: yann@1: + yann@1: + p_fpr: bottom of the FPR area (growing upwards) yann@1: + p_gpr: bottom of the GPR area (growing upwards) yann@1: + p_ov: bottom of the overflow area (growing upwards) yann@1: + p_struct: top of the struct copy area (growing downwards) yann@1: + yann@1: + All areas are kept aligned to twice the word size. */ yann@1: + yann@1: + int gpr_off = ecif->cif->bytes; yann@1: + int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); yann@1: + yann@1: + unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); yann@1: + unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); yann@1: + unsigned char *p_struct = (unsigned char *)p_gpr; yann@1: + unsigned long *p_ov = (unsigned long *)stack; yann@1: + yann@1: + int n_fpr = 0; yann@1: + int n_gpr = 0; yann@1: + int n_ov = 0; yann@1: + yann@1: + ffi_type **ptr; yann@1: + void **p_argv = ecif->avalue; yann@1: + int i; yann@1: + yann@1: + /* If we returning a structure then we set the first parameter register yann@1: + to the address of where we are returning this structure. */ yann@1: + yann@1: + if (ecif->cif->flags == FFI390_RET_STRUCT) yann@1: + p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; yann@1: + yann@1: + /* Now for the arguments. */ yann@1: + yann@1: + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; yann@1: + i > 0; yann@1: + i--, ptr++, p_argv++) yann@1: + { yann@1: + void *arg = *p_argv; yann@1: + int type = (*ptr)->type; yann@1: + yann@1: + /* Check how a structure type is passed. */ yann@1: + if (type == FFI_TYPE_STRUCT) yann@1: + { yann@1: + type = ffi_check_struct_type (*ptr); yann@1: + yann@1: + /* If we pass the struct via pointer, copy the data. */ yann@1: + if (type == FFI_TYPE_POINTER) yann@1: + { yann@1: + p_struct -= ROUND_SIZE ((*ptr)->size); yann@1: + memcpy (p_struct, (char *)arg, (*ptr)->size); yann@1: + arg = &p_struct; yann@1: + } yann@1: + } yann@1: + yann@1: + /* Pointers are passed like UINTs of the same size. */ yann@1: + if (type == FFI_TYPE_POINTER) yann@1: +#ifdef __s390x__ yann@1: + type = FFI_TYPE_UINT64; yann@1: +#else yann@1: + type = FFI_TYPE_UINT32; yann@1: +#endif yann@1: + yann@1: + /* Now handle all primitive int/float data types. */ yann@1: + switch (type) yann@1: + { yann@1: + case FFI_TYPE_DOUBLE: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + p_fpr[n_fpr++] = *(unsigned long long *) arg; yann@1: + else yann@1: +#ifdef __s390x__ yann@1: + p_ov[n_ov++] = *(unsigned long *) arg; yann@1: +#else yann@1: + p_ov[n_ov++] = ((unsigned long *) arg)[0], yann@1: + p_ov[n_ov++] = ((unsigned long *) arg)[1]; yann@1: +#endif yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; yann@1: + else yann@1: + p_ov[n_ov++] = *(unsigned int *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: +#ifdef __s390x__ yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(unsigned long *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(unsigned long *) arg; yann@1: +#else yann@1: + if (n_gpr == MAX_GPRARGS-1) yann@1: + n_gpr = MAX_GPRARGS; yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = ((unsigned long *) arg)[0], yann@1: + p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; yann@1: + else yann@1: + p_ov[n_ov++] = ((unsigned long *) arg)[0], yann@1: + p_ov[n_ov++] = ((unsigned long *) arg)[1]; yann@1: +#endif yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT32: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(unsigned int *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(unsigned int *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_INT: yann@1: + case FFI_TYPE_SINT32: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(signed int *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(signed int *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT16: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(unsigned short *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(unsigned short *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT16: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(signed short *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(signed short *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT8: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(unsigned char *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(unsigned char *) arg; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT8: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + p_gpr[n_gpr++] = *(signed char *) arg; yann@1: + else yann@1: + p_ov[n_ov++] = *(signed char *) arg; yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT (0); yann@1: + break; yann@1: + } yann@1: + } yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_prep_cif_machdep. */ yann@1: +/* */ yann@1: +/* Function - Perform machine dependent CIF processing. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +ffi_status yann@1: +ffi_prep_cif_machdep(ffi_cif *cif) yann@1: +{ yann@1: + size_t struct_size = 0; yann@1: + int n_gpr = 0; yann@1: + int n_fpr = 0; yann@1: + int n_ov = 0; yann@1: + yann@1: + ffi_type **ptr; yann@1: + int i; yann@1: + yann@1: + /* Determine return value handling. */ yann@1: + yann@1: + switch (cif->rtype->type) yann@1: + { yann@1: + /* Void is easy. */ yann@1: + case FFI_TYPE_VOID: yann@1: + cif->flags = FFI390_RET_VOID; yann@1: + break; yann@1: + yann@1: + /* Structures are returned via a hidden pointer. */ yann@1: + case FFI_TYPE_STRUCT: yann@1: + cif->flags = FFI390_RET_STRUCT; yann@1: + n_gpr++; /* We need one GPR to pass the pointer. */ yann@1: + break; yann@1: + yann@1: + /* Floating point values are returned in fpr 0. */ yann@1: + case FFI_TYPE_FLOAT: yann@1: + cif->flags = FFI390_RET_FLOAT; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + cif->flags = FFI390_RET_DOUBLE; yann@1: + break; yann@1: + yann@1: + /* Integer values are returned in gpr 2 (and gpr 3 yann@1: + for 64-bit values on 31-bit machines). */ yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: + cif->flags = FFI390_RET_INT64; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_POINTER: yann@1: + case FFI_TYPE_INT: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_SINT8: yann@1: + /* These are to be extended to word size. */ yann@1: +#ifdef __s390x__ yann@1: + cif->flags = FFI390_RET_INT64; yann@1: +#else yann@1: + cif->flags = FFI390_RET_INT32; yann@1: +#endif yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT (0); yann@1: + break; yann@1: + } yann@1: + yann@1: + /* Now for the arguments. */ yann@1: + yann@1: + for (ptr = cif->arg_types, i = cif->nargs; yann@1: + i > 0; yann@1: + i--, ptr++) yann@1: + { yann@1: + int type = (*ptr)->type; yann@1: + yann@1: + /* Check how a structure type is passed. */ yann@1: + if (type == FFI_TYPE_STRUCT) yann@1: + { yann@1: + type = ffi_check_struct_type (*ptr); yann@1: + yann@1: + /* If we pass the struct via pointer, we must reserve space yann@1: + to copy its data for proper call-by-value semantics. */ yann@1: + if (type == FFI_TYPE_POINTER) yann@1: + struct_size += ROUND_SIZE ((*ptr)->size); yann@1: + } yann@1: + yann@1: + /* Now handle all primitive int/float data types. */ yann@1: + switch (type) yann@1: + { yann@1: + /* The first MAX_FPRARGS floating point arguments yann@1: + go in FPRs, the rest overflow to the stack. */ yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + n_fpr++; yann@1: + else yann@1: + n_ov += sizeof (double) / sizeof (long); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + n_fpr++; yann@1: + else yann@1: + n_ov++; yann@1: + break; yann@1: + yann@1: + /* On 31-bit machines, 64-bit integers are passed in GPR pairs, yann@1: + if one is still available, or else on the stack. If only one yann@1: + register is free, skip the register (it won't be used for any yann@1: + subsequent argument either). */ yann@1: + yann@1: +#ifndef __s390x__ yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: + if (n_gpr == MAX_GPRARGS-1) yann@1: + n_gpr = MAX_GPRARGS; yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + n_gpr += 2; yann@1: + else yann@1: + n_ov += 2; yann@1: + break; yann@1: +#endif yann@1: + yann@1: + /* Everything else is passed in GPRs (until MAX_GPRARGS yann@1: + have been used) or overflows to the stack. */ yann@1: + yann@1: + default: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + n_gpr++; yann@1: + else yann@1: + n_ov++; yann@1: + break; yann@1: + } yann@1: + } yann@1: + yann@1: + /* Total stack space as required for overflow arguments yann@1: + and temporary structure copies. */ yann@1: + yann@1: + cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_call. */ yann@1: +/* */ yann@1: +/* Function - Call the FFI routine. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +void yann@1: +ffi_call(ffi_cif *cif, yann@1: + void (*fn)(), yann@1: + void *rvalue, yann@1: + void **avalue) yann@1: +{ yann@1: + int ret_type = cif->flags; yann@1: + extended_cif ecif; yann@1: + yann@1: + ecif.cif = cif; yann@1: + ecif.avalue = avalue; yann@1: + ecif.rvalue = rvalue; yann@1: + yann@1: + /* If we don't have a return value, we need to fake one. */ yann@1: + if (rvalue == NULL) yann@1: + { yann@1: + if (ret_type == FFI390_RET_STRUCT) yann@1: + ecif.rvalue = alloca (cif->rtype->size); yann@1: + else yann@1: + ret_type = FFI390_RET_VOID; yann@1: + } yann@1: + yann@1: + switch (cif->abi) yann@1: + { yann@1: + case FFI_SYSV: yann@1: + ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, yann@1: + ret_type, ecif.rvalue, fn); yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT (0); yann@1: + break; yann@1: + } yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_closure_helper_SYSV. */ yann@1: +/* */ yann@1: +/* Function - Call a FFI closure target function. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +void yann@1: +ffi_closure_helper_SYSV (ffi_closure *closure, yann@1: + unsigned long *p_gpr, yann@1: + unsigned long long *p_fpr, yann@1: + unsigned long *p_ov) yann@1: +{ yann@1: + unsigned long long ret_buffer; yann@1: + yann@1: + void *rvalue = &ret_buffer; yann@1: + void **avalue; yann@1: + void **p_arg; yann@1: + yann@1: + int n_gpr = 0; yann@1: + int n_fpr = 0; yann@1: + int n_ov = 0; yann@1: + yann@1: + ffi_type **ptr; yann@1: + int i; yann@1: + yann@1: + /* Allocate buffer for argument list pointers. */ yann@1: + yann@1: + p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); yann@1: + yann@1: + /* If we returning a structure, pass the structure address yann@1: + directly to the target function. Otherwise, have the target yann@1: + function store the return value to the GPR save area. */ yann@1: + yann@1: + if (closure->cif->flags == FFI390_RET_STRUCT) yann@1: + rvalue = (void *) p_gpr[n_gpr++]; yann@1: + yann@1: + /* Now for the arguments. */ yann@1: + yann@1: + for (ptr = closure->cif->arg_types, i = closure->cif->nargs; yann@1: + i > 0; yann@1: + i--, p_arg++, ptr++) yann@1: + { yann@1: + int deref_struct_pointer = 0; yann@1: + int type = (*ptr)->type; yann@1: + yann@1: + /* Check how a structure type is passed. */ yann@1: + if (type == FFI_TYPE_STRUCT) yann@1: + { yann@1: + type = ffi_check_struct_type (*ptr); yann@1: + yann@1: + /* If we pass the struct via pointer, remember to yann@1: + retrieve the pointer later. */ yann@1: + if (type == FFI_TYPE_POINTER) yann@1: + deref_struct_pointer = 1; yann@1: + } yann@1: + yann@1: + /* Pointers are passed like UINTs of the same size. */ yann@1: + if (type == FFI_TYPE_POINTER) yann@1: +#ifdef __s390x__ yann@1: + type = FFI_TYPE_UINT64; yann@1: +#else yann@1: + type = FFI_TYPE_UINT32; yann@1: +#endif yann@1: + yann@1: + /* Now handle all primitive int/float data types. */ yann@1: + switch (type) yann@1: + { yann@1: + case FFI_TYPE_DOUBLE: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + *p_arg = &p_fpr[n_fpr++]; yann@1: + else yann@1: + *p_arg = &p_ov[n_ov], yann@1: + n_ov += sizeof (double) / sizeof (long); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (n_fpr < MAX_FPRARGS) yann@1: + *p_arg = &p_fpr[n_fpr++]; yann@1: + else yann@1: + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: +#ifdef __s390x__ yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + *p_arg = &p_gpr[n_gpr++]; yann@1: + else yann@1: + *p_arg = &p_ov[n_ov++]; yann@1: +#else yann@1: + if (n_gpr == MAX_GPRARGS-1) yann@1: + n_gpr = MAX_GPRARGS; yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + *p_arg = &p_gpr[n_gpr], n_gpr += 2; yann@1: + else yann@1: + *p_arg = &p_ov[n_ov], n_ov += 2; yann@1: +#endif yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_INT: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_SINT32: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; yann@1: + else yann@1: + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_SINT16: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; yann@1: + else yann@1: + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_SINT8: yann@1: + if (n_gpr < MAX_GPRARGS) yann@1: + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; yann@1: + else yann@1: + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT (0); yann@1: + break; yann@1: + } yann@1: + yann@1: + /* If this is a struct passed via pointer, we need to yann@1: + actually retrieve that pointer. */ yann@1: + if (deref_struct_pointer) yann@1: + *p_arg = *(void **)*p_arg; yann@1: + } yann@1: + yann@1: + yann@1: + /* Call the target function. */ yann@1: + (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); yann@1: + yann@1: + /* Convert the return value. */ yann@1: + switch (closure->cif->rtype->type) yann@1: + { yann@1: + /* Void is easy, and so is struct. */ yann@1: + case FFI_TYPE_VOID: yann@1: + case FFI_TYPE_STRUCT: yann@1: + break; yann@1: + yann@1: + /* Floating point values are returned in fpr 0. */ yann@1: + case FFI_TYPE_FLOAT: yann@1: + p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + p_fpr[0] = *(unsigned long long *) rvalue; yann@1: + break; yann@1: + yann@1: + /* Integer values are returned in gpr 2 (and gpr 3 yann@1: + for 64-bit values on 31-bit machines). */ yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: +#ifdef __s390x__ yann@1: + p_gpr[0] = *(unsigned long *) rvalue; yann@1: +#else yann@1: + p_gpr[0] = ((unsigned long *) rvalue)[0], yann@1: + p_gpr[1] = ((unsigned long *) rvalue)[1]; yann@1: +#endif yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_POINTER: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_UINT8: yann@1: + p_gpr[0] = *(unsigned long *) rvalue; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_INT: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_SINT8: yann@1: + p_gpr[0] = *(signed long *) rvalue; yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT (0); yann@1: + break; yann@1: + } yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: +/*====================================================================*/ yann@1: +/* */ yann@1: +/* Name - ffi_prep_closure. */ yann@1: +/* */ yann@1: +/* Function - Prepare a FFI closure. */ yann@1: +/* */ yann@1: +/*====================================================================*/ yann@1: + yann@1: +ffi_status yann@1: +ffi_prep_closure (ffi_closure *closure, yann@1: + ffi_cif *cif, yann@1: + void (*fun) (ffi_cif *, void *, void **, void *), yann@1: + void *user_data) yann@1: +{ yann@1: + FFI_ASSERT (cif->abi == FFI_SYSV); yann@1: + yann@1: +#ifndef __s390x__ yann@1: + *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ yann@1: + *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ yann@1: + *(short *)&closure->tramp [4] = 0x1006; yann@1: + *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ yann@1: + *(long *)&closure->tramp [8] = (long)closure; yann@1: + *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; yann@1: +#else yann@1: + *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ yann@1: + *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ yann@1: + *(short *)&closure->tramp [4] = 0x100e; yann@1: + *(short *)&closure->tramp [6] = 0x0004; yann@1: + *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ yann@1: + *(long *)&closure->tramp[16] = (long)closure; yann@1: + *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; yann@1: +#endif yann@1: + yann@1: + closure->cif = cif; yann@1: + closure->user_data = user_data; yann@1: + closure->fun = fun; yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +/*======================== End of Routine ============================*/ yann@1: + yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S yann@1: --- gcc-3.2.2.orig/libffi/src/s390/sysv.S Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/s390/sysv.S Thu Nov 28 01:44:35 2002 yann@1: @@ -0,0 +1,425 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + sysv.S - Copyright (c) 2000 Software AG yann@1: + yann@1: + S390 Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: + yann@1: +#ifndef __s390x__ yann@1: + yann@1: +.text yann@1: + yann@1: + # r2: cif->bytes yann@1: + # r3: &ecif yann@1: + # r4: ffi_prep_args yann@1: + # r5: ret_type yann@1: + # r6: ecif.rvalue yann@1: + # ov: fn yann@1: + yann@1: + # This assumes we are using gas. yann@1: + .globl ffi_call_SYSV yann@1: + .type ffi_call_SYSV,%function yann@1: +ffi_call_SYSV: yann@1: +.LFB1: yann@1: + stm %r6,%r15,24(%r15) # Save registers yann@1: +.LCFI0: yann@1: + basr %r13,0 # Set up base register yann@1: +.Lbase: yann@1: + lr %r11,%r15 # Set up frame pointer yann@1: +.LCFI1: yann@1: + sr %r15,%r2 yann@1: + ahi %r15,-96-48 # Allocate stack yann@1: + lr %r8,%r6 # Save ecif.rvalue yann@1: + sr %r9,%r9 yann@1: + ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address yann@1: + l %r7,96(%r11) # Load function address yann@1: + st %r11,0(%r15) # Set up back chain yann@1: + ahi %r11,-48 # Register save area yann@1: +.LCFI2: yann@1: + yann@1: + la %r2,96(%r15) # Save area yann@1: + # r3 already holds &ecif yann@1: + basr %r14,%r4 # Call ffi_prep_args yann@1: + yann@1: + lm %r2,%r6,0(%r11) # Load arguments yann@1: + ld %f0,32(%r11) yann@1: + ld %f2,40(%r11) yann@1: + la %r14,0(%r13,%r9) # Set return address yann@1: + br %r7 # ... and call function yann@1: + yann@1: +.LretNone: # Return void yann@1: + l %r4,48+56(%r11) yann@1: + lm %r6,%r15,48+24(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretFloat: yann@1: + l %r4,48+56(%r11) yann@1: + ste %f0,0(%r8) # Return float yann@1: + lm %r6,%r15,48+24(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretDouble: yann@1: + l %r4,48+56(%r11) yann@1: + std %f0,0(%r8) # Return double yann@1: + lm %r6,%r15,48+24(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretInt32: yann@1: + l %r4,48+56(%r11) yann@1: + st %r2,0(%r8) # Return int yann@1: + lm %r6,%r15,48+24(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretInt64: yann@1: + l %r4,48+56(%r11) yann@1: + stm %r2,%r3,0(%r8) # Return long long yann@1: + lm %r6,%r15,48+24(%r11) yann@1: + br %r4 yann@1: + yann@1: +.Ltable: yann@1: + .byte .LretNone-.Lbase # FFI390_RET_VOID yann@1: + .byte .LretNone-.Lbase # FFI390_RET_STRUCT yann@1: + .byte .LretFloat-.Lbase # FFI390_RET_FLOAT yann@1: + .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE yann@1: + .byte .LretInt32-.Lbase # FFI390_RET_INT32 yann@1: + .byte .LretInt64-.Lbase # FFI390_RET_INT64 yann@1: + yann@1: +.LFE1: yann@1: +.ffi_call_SYSV_end: yann@1: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV yann@1: + yann@1: + yann@1: + .globl ffi_closure_SYSV yann@1: + .type ffi_closure_SYSV,%function yann@1: +ffi_closure_SYSV: yann@1: +.LFB2: yann@1: + stm %r12,%r15,48(%r15) # Save registers yann@1: +.LCFI10: yann@1: + basr %r13,0 # Set up base register yann@1: +.Lcbase: yann@1: + stm %r2,%r6,8(%r15) # Save arguments yann@1: + std %f0,64(%r15) yann@1: + std %f2,72(%r15) yann@1: + lr %r1,%r15 # Set up stack frame yann@1: + ahi %r15,-96 yann@1: +.LCFI11: yann@1: + l %r12,.Lchelper-.Lcbase(%r13) # Get helper function yann@1: + lr %r2,%r0 # Closure yann@1: + la %r3,8(%r1) # GPRs yann@1: + la %r4,64(%r1) # FPRs yann@1: + la %r5,96(%r1) # Overflow yann@1: + st %r1,0(%r15) # Set up back chain yann@1: + yann@1: + bas %r14,0(%r12,%r13) # Call helper yann@1: + yann@1: + l %r4,96+56(%r15) yann@1: + ld %f0,96+64(%r15) # Load return registers yann@1: + lm %r2,%r3,96+8(%r15) yann@1: + lm %r12,%r15,96+48(%r15) yann@1: + br %r4 yann@1: + yann@1: + .align 4 yann@1: +.Lchelper: yann@1: + .long ffi_closure_helper_SYSV-.Lcbase yann@1: + yann@1: +.LFE2: yann@1: + yann@1: +.ffi_closure_SYSV_end: yann@1: + .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV yann@1: + yann@1: + yann@1: + .section .eh_frame,"a",@progbits yann@1: +.Lframe1: yann@1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry yann@1: +.LSCIE1: yann@1: + .4byte 0x0 # CIE Identifier Tag yann@1: + .byte 0x1 # CIE Version yann@1: + .ascii "zR\0" # CIE Augmentation yann@1: + .uleb128 0x1 # CIE Code Alignment Factor yann@1: + .sleb128 -4 # CIE Data Alignment Factor yann@1: + .byte 0xe # CIE RA Column yann@1: + .uleb128 0x1 # Augmentation size yann@1: + .byte 0x1b # FDE Encoding (pcrel sdata4) yann@1: + .byte 0xc # DW_CFA_def_cfa yann@1: + .uleb128 0xf yann@1: + .uleb128 0x60 yann@1: + .align 4 yann@1: +.LECIE1: yann@1: +.LSFDE1: yann@1: + .4byte .LEFDE1-.LASFDE1 # FDE Length yann@1: +.LASFDE1: yann@1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset yann@1: + .4byte .LFB1-. # FDE initial location yann@1: + .4byte .LFE1-.LFB1 # FDE address range yann@1: + .uleb128 0x0 # Augmentation size yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI0-.LFB1 yann@1: + .byte 0x8f # DW_CFA_offset, column 0xf yann@1: + .uleb128 0x9 yann@1: + .byte 0x8e # DW_CFA_offset, column 0xe yann@1: + .uleb128 0xa yann@1: + .byte 0x8d # DW_CFA_offset, column 0xd yann@1: + .uleb128 0xb yann@1: + .byte 0x8c # DW_CFA_offset, column 0xc yann@1: + .uleb128 0xc yann@1: + .byte 0x8b # DW_CFA_offset, column 0xb yann@1: + .uleb128 0xd yann@1: + .byte 0x8a # DW_CFA_offset, column 0xa yann@1: + .uleb128 0xe yann@1: + .byte 0x89 # DW_CFA_offset, column 0x9 yann@1: + .uleb128 0xf yann@1: + .byte 0x88 # DW_CFA_offset, column 0x8 yann@1: + .uleb128 0x10 yann@1: + .byte 0x87 # DW_CFA_offset, column 0x7 yann@1: + .uleb128 0x11 yann@1: + .byte 0x86 # DW_CFA_offset, column 0x6 yann@1: + .uleb128 0x12 yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI1-.LCFI0 yann@1: + .byte 0xd # DW_CFA_def_cfa_register yann@1: + .uleb128 0xb yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI2-.LCFI1 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0x90 yann@1: + .align 4 yann@1: +.LEFDE1: yann@1: +.LSFDE2: yann@1: + .4byte .LEFDE2-.LASFDE2 # FDE Length yann@1: +.LASFDE2: yann@1: + .4byte .LASFDE2-.Lframe1 # FDE CIE offset yann@1: + .4byte .LFB2-. # FDE initial location yann@1: + .4byte .LFE2-.LFB2 # FDE address range yann@1: + .uleb128 0x0 # Augmentation size yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI10-.LFB2 yann@1: + .byte 0x8f # DW_CFA_offset, column 0xf yann@1: + .uleb128 0x9 yann@1: + .byte 0x8e # DW_CFA_offset, column 0xe yann@1: + .uleb128 0xa yann@1: + .byte 0x8d # DW_CFA_offset, column 0xd yann@1: + .uleb128 0xb yann@1: + .byte 0x8c # DW_CFA_offset, column 0xc yann@1: + .uleb128 0xc yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI11-.LCFI10 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0xc0 yann@1: + .align 4 yann@1: +.LEFDE2: yann@1: + yann@1: +#else yann@1: + yann@1: +.text yann@1: + yann@1: + # r2: cif->bytes yann@1: + # r3: &ecif yann@1: + # r4: ffi_prep_args yann@1: + # r5: ret_type yann@1: + # r6: ecif.rvalue yann@1: + # ov: fn yann@1: + yann@1: + # This assumes we are using gas. yann@1: + .globl ffi_call_SYSV yann@1: + .type ffi_call_SYSV,%function yann@1: +ffi_call_SYSV: yann@1: +.LFB1: yann@1: + stmg %r6,%r15,48(%r15) # Save registers yann@1: +.LCFI0: yann@1: + larl %r13,.Lbase # Set up base register yann@1: + lgr %r11,%r15 # Set up frame pointer yann@1: +.LCFI1: yann@1: + sgr %r15,%r2 yann@1: + aghi %r15,-160-80 # Allocate stack yann@1: + lgr %r8,%r6 # Save ecif.rvalue yann@1: + llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address yann@1: + lg %r7,160(%r11) # Load function address yann@1: + stg %r11,0(%r15) # Set up back chain yann@1: + aghi %r11,-80 # Register save area yann@1: +.LCFI2: yann@1: + yann@1: + la %r2,160(%r15) # Save area yann@1: + # r3 already holds &ecif yann@1: + basr %r14,%r4 # Call ffi_prep_args yann@1: + yann@1: + lmg %r2,%r6,0(%r11) # Load arguments yann@1: + ld %f0,48(%r11) yann@1: + ld %f2,56(%r11) yann@1: + ld %f4,64(%r11) yann@1: + ld %f6,72(%r11) yann@1: + la %r14,0(%r13,%r9) # Set return address yann@1: + br %r7 # ... and call function yann@1: + yann@1: +.Lbase: yann@1: +.LretNone: # Return void yann@1: + lg %r4,80+112(%r11) yann@1: + lmg %r6,%r15,80+48(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretFloat: yann@1: + lg %r4,80+112(%r11) yann@1: + ste %f0,0(%r8) # Return float yann@1: + lmg %r6,%r15,80+48(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretDouble: yann@1: + lg %r4,80+112(%r11) yann@1: + std %f0,0(%r8) # Return double yann@1: + lmg %r6,%r15,80+48(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretInt32: yann@1: + lg %r4,80+112(%r11) yann@1: + st %r2,0(%r8) # Return int yann@1: + lmg %r6,%r15,80+48(%r11) yann@1: + br %r4 yann@1: + yann@1: +.LretInt64: yann@1: + lg %r4,80+112(%r11) yann@1: + stg %r2,0(%r8) # Return long yann@1: + lmg %r6,%r15,80+48(%r11) yann@1: + br %r4 yann@1: + yann@1: +.Ltable: yann@1: + .byte .LretNone-.Lbase # FFI390_RET_VOID yann@1: + .byte .LretNone-.Lbase # FFI390_RET_STRUCT yann@1: + .byte .LretFloat-.Lbase # FFI390_RET_FLOAT yann@1: + .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE yann@1: + .byte .LretInt32-.Lbase # FFI390_RET_INT32 yann@1: + .byte .LretInt64-.Lbase # FFI390_RET_INT64 yann@1: + yann@1: +.LFE1: yann@1: +.ffi_call_SYSV_end: yann@1: + .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV yann@1: + yann@1: + yann@1: + .globl ffi_closure_SYSV yann@1: + .type ffi_closure_SYSV,%function yann@1: +ffi_closure_SYSV: yann@1: +.LFB2: yann@1: + stmg %r14,%r15,112(%r15) # Save registers yann@1: +.LCFI10: yann@1: + stmg %r2,%r6,16(%r15) # Save arguments yann@1: + std %f0,128(%r15) yann@1: + std %f2,136(%r15) yann@1: + std %f4,144(%r15) yann@1: + std %f6,152(%r15) yann@1: + lgr %r1,%r15 # Set up stack frame yann@1: + aghi %r15,-160 yann@1: +.LCFI11: yann@1: + lgr %r2,%r0 # Closure yann@1: + la %r3,16(%r1) # GPRs yann@1: + la %r4,128(%r1) # FPRs yann@1: + la %r5,160(%r1) # Overflow yann@1: + stg %r1,0(%r15) # Set up back chain yann@1: + yann@1: + brasl %r14,ffi_closure_helper_SYSV # Call helper yann@1: + yann@1: + lg %r14,160+112(%r15) yann@1: + ld %f0,160+128(%r15) # Load return registers yann@1: + lg %r2,160+16(%r15) yann@1: + la %r15,160(%r15) yann@1: + br %r14 yann@1: +.LFE2: yann@1: + yann@1: +.ffi_closure_SYSV_end: yann@1: + .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV yann@1: + yann@1: + yann@1: + yann@1: + .section .eh_frame,"a",@progbits yann@1: +.Lframe1: yann@1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry yann@1: +.LSCIE1: yann@1: + .4byte 0x0 # CIE Identifier Tag yann@1: + .byte 0x1 # CIE Version yann@1: + .ascii "zR\0" # CIE Augmentation yann@1: + .uleb128 0x1 # CIE Code Alignment Factor yann@1: + .sleb128 -8 # CIE Data Alignment Factor yann@1: + .byte 0xe # CIE RA Column yann@1: + .uleb128 0x1 # Augmentation size yann@1: + .byte 0x1b # FDE Encoding (pcrel sdata4) yann@1: + .byte 0xc # DW_CFA_def_cfa yann@1: + .uleb128 0xf yann@1: + .uleb128 0xa0 yann@1: + .align 8 yann@1: +.LECIE1: yann@1: +.LSFDE1: yann@1: + .4byte .LEFDE1-.LASFDE1 # FDE Length yann@1: +.LASFDE1: yann@1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset yann@1: + .4byte .LFB1-. # FDE initial location yann@1: + .4byte .LFE1-.LFB1 # FDE address range yann@1: + .uleb128 0x0 # Augmentation size yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI0-.LFB1 yann@1: + .byte 0x8f # DW_CFA_offset, column 0xf yann@1: + .uleb128 0x5 yann@1: + .byte 0x8e # DW_CFA_offset, column 0xe yann@1: + .uleb128 0x6 yann@1: + .byte 0x8d # DW_CFA_offset, column 0xd yann@1: + .uleb128 0x7 yann@1: + .byte 0x8c # DW_CFA_offset, column 0xc yann@1: + .uleb128 0x8 yann@1: + .byte 0x8b # DW_CFA_offset, column 0xb yann@1: + .uleb128 0x9 yann@1: + .byte 0x8a # DW_CFA_offset, column 0xa yann@1: + .uleb128 0xa yann@1: + .byte 0x89 # DW_CFA_offset, column 0x9 yann@1: + .uleb128 0xb yann@1: + .byte 0x88 # DW_CFA_offset, column 0x8 yann@1: + .uleb128 0xc yann@1: + .byte 0x87 # DW_CFA_offset, column 0x7 yann@1: + .uleb128 0xd yann@1: + .byte 0x86 # DW_CFA_offset, column 0x6 yann@1: + .uleb128 0xe yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI1-.LCFI0 yann@1: + .byte 0xd # DW_CFA_def_cfa_register yann@1: + .uleb128 0xb yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI2-.LCFI1 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0xf0 yann@1: + .align 8 yann@1: +.LEFDE1: yann@1: +.LSFDE2: yann@1: + .4byte .LEFDE2-.LASFDE2 # FDE Length yann@1: +.LASFDE2: yann@1: + .4byte .LASFDE2-.Lframe1 # FDE CIE offset yann@1: + .4byte .LFB2-. # FDE initial location yann@1: + .4byte .LFE2-.LFB2 # FDE address range yann@1: + .uleb128 0x0 # Augmentation size yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI10-.LFB2 yann@1: + .byte 0x8f # DW_CFA_offset, column 0xf yann@1: + .uleb128 0x5 yann@1: + .byte 0x8e # DW_CFA_offset, column 0xe yann@1: + .uleb128 0x6 yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .4byte .LCFI11-.LCFI10 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0x140 yann@1: + .align 8 yann@1: +.LEFDE2: yann@1: + yann@1: +#endif yann@1: + yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/sh/ffi.c Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/sh/ffi.c Fri Jul 19 10:08:43 2002 yann@1: @@ -0,0 +1,722 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + ffi.c - Copyright (c) 2002 Kaz Kojima yann@1: + yann@1: + SuperH Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: + yann@1: +#include yann@1: +#include yann@1: + yann@1: +#include yann@1: + yann@1: +#define NGREGARG 4 yann@1: +#if defined(__SH4__) yann@1: +#define NFREGARG 8 yann@1: +#endif yann@1: + yann@1: +#if defined(__HITACHI__) yann@1: +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 yann@1: +#else yann@1: +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 yann@1: +#endif yann@1: + yann@1: +/* If the structure has essentialy an unique element, return its type. */ yann@1: +static int yann@1: +simple_type (ffi_type *arg) yann@1: +{ yann@1: + if (arg->type != FFI_TYPE_STRUCT) yann@1: + return arg->type; yann@1: + else if (arg->elements[1]) yann@1: + return FFI_TYPE_STRUCT; yann@1: + yann@1: + return simple_type (arg->elements[0]); yann@1: +} yann@1: + yann@1: +static int yann@1: +return_type (ffi_type *arg) yann@1: +{ yann@1: + unsigned short type; yann@1: + yann@1: + if (arg->type != FFI_TYPE_STRUCT) yann@1: + return arg->type; yann@1: + yann@1: + type = simple_type (arg->elements[0]); yann@1: + if (! arg->elements[1]) yann@1: + { yann@1: + switch (type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_UINT32: yann@1: + return FFI_TYPE_INT; yann@1: + yann@1: + default: yann@1: + return type; yann@1: + } yann@1: + } yann@1: + yann@1: + /* gcc uses r0/r1 pair for some kind of structures. */ yann@1: + if (arg->size <= 2 * sizeof (int)) yann@1: + { yann@1: + int i = 0; yann@1: + ffi_type *e; yann@1: + yann@1: + while ((e = arg->elements[i++])) yann@1: + { yann@1: + type = simple_type (e); yann@1: + switch (type) yann@1: + { yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_INT: yann@1: + case FFI_TYPE_FLOAT: yann@1: + return FFI_TYPE_UINT64; yann@1: + yann@1: + default: yann@1: + break; yann@1: + } yann@1: + } yann@1: + } yann@1: + yann@1: + return FFI_TYPE_STRUCT; yann@1: +} yann@1: + yann@1: +/* ffi_prep_args is called by the assembly routine once stack space yann@1: + has been allocated for the function's arguments */ yann@1: + yann@1: +/*@-exportheader@*/ yann@1: +void ffi_prep_args(char *stack, extended_cif *ecif) yann@1: +/*@=exportheader@*/ yann@1: +{ yann@1: + register unsigned int i; yann@1: + register int tmp; yann@1: + register unsigned int avn; yann@1: + register void **p_argv; yann@1: + register char *argp; yann@1: + register ffi_type **p_arg; yann@1: + int greg, ireg; yann@1: +#if defined(__SH4__) yann@1: + int freg = 0; yann@1: +#endif yann@1: + yann@1: + tmp = 0; yann@1: + argp = stack; yann@1: + yann@1: + if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) yann@1: + { yann@1: + *(void **) argp = ecif->rvalue; yann@1: + argp += 4; yann@1: + ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; yann@1: + } yann@1: + else yann@1: + ireg = 0; yann@1: + yann@1: + /* Set arguments for registers. */ yann@1: + greg = ireg; yann@1: + avn = ecif->cif->nargs; yann@1: + p_argv = ecif->avalue; yann@1: + yann@1: + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) yann@1: + { yann@1: + size_t z; yann@1: + yann@1: + z = (*p_arg)->size; yann@1: + if (z < sizeof(int)) yann@1: + { yann@1: + if (greg++ >= NGREGARG) yann@1: + continue; yann@1: + yann@1: + z = sizeof(int); yann@1: + switch ((*p_arg)->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT8: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT16: yann@1: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT16: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_STRUCT: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + argp += z; yann@1: + } yann@1: + else if (z == sizeof(int)) yann@1: + { yann@1: +#if defined(__SH4__) yann@1: + if ((*p_arg)->type == FFI_TYPE_FLOAT) yann@1: + { yann@1: + if (freg++ >= NFREGARG) yann@1: + continue; yann@1: + } yann@1: + else yann@1: +#endif yann@1: + { yann@1: + if (greg++ >= NGREGARG) yann@1: + continue; yann@1: + } yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); yann@1: + argp += z; yann@1: + } yann@1: +#if defined(__SH4__) yann@1: + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) yann@1: + { yann@1: + if (freg + 1 >= NFREGARG) yann@1: + continue; yann@1: + freg = (freg + 1) & ~1; yann@1: + freg += 2; yann@1: + memcpy (argp, *p_argv, z); yann@1: + argp += z; yann@1: + } yann@1: +#endif yann@1: + else yann@1: + { yann@1: + int n = (z + sizeof (int) - 1) / sizeof (int); yann@1: +#if defined(__SH4__) yann@1: + if (greg + n - 1 >= NGREGARG) yann@1: + continue; yann@1: + greg += n; yann@1: +#else yann@1: + if (greg >= NGREGARG) yann@1: + continue; yann@1: + else if (greg + n - 1 >= NGREGARG) yann@1: + greg = NGREGARG; yann@1: + else yann@1: + greg += n; yann@1: +#endif yann@1: + memcpy (argp, *p_argv, z); yann@1: + argp += z; yann@1: + } yann@1: + } yann@1: + yann@1: + /* Set arguments on stack. */ yann@1: + greg = ireg; yann@1: +#if defined(__SH4__) yann@1: + freg = 0; yann@1: +#endif yann@1: + p_argv = ecif->avalue; yann@1: + yann@1: + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) yann@1: + { yann@1: + size_t z; yann@1: + yann@1: + z = (*p_arg)->size; yann@1: + if (z < sizeof(int)) yann@1: + { yann@1: + if (greg++ < NGREGARG) yann@1: + continue; yann@1: + yann@1: + z = sizeof(int); yann@1: + switch ((*p_arg)->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT8: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT16: yann@1: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT16: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_STRUCT: yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + argp += z; yann@1: + } yann@1: + else if (z == sizeof(int)) yann@1: + { yann@1: +#if defined(__SH4__) yann@1: + if ((*p_arg)->type == FFI_TYPE_FLOAT) yann@1: + { yann@1: + if (freg++ < NFREGARG) yann@1: + continue; yann@1: + } yann@1: + else yann@1: +#endif yann@1: + { yann@1: + if (greg++ < NGREGARG) yann@1: + continue; yann@1: + } yann@1: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); yann@1: + argp += z; yann@1: + } yann@1: +#if defined(__SH4__) yann@1: + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) yann@1: + { yann@1: + if (freg + 1 < NFREGARG) yann@1: + { yann@1: + freg = (freg + 1) & ~1; yann@1: + freg += 2; yann@1: + continue; yann@1: + } yann@1: + memcpy (argp, *p_argv, z); yann@1: + argp += z; yann@1: + } yann@1: +#endif yann@1: + else yann@1: + { yann@1: + int n = (z + sizeof (int) - 1) / sizeof (int); yann@1: + if (greg + n - 1 < NGREGARG) yann@1: + { yann@1: + greg += n; yann@1: + continue; yann@1: + } yann@1: +#if (! defined(__SH4__)) yann@1: + else if (greg < NGREGARG) yann@1: + { yann@1: + greg = NGREGARG; yann@1: + continue; yann@1: + } yann@1: +#endif yann@1: + memcpy (argp, *p_argv, z); yann@1: + argp += z; yann@1: + } yann@1: + } yann@1: + yann@1: + return; yann@1: +} yann@1: + yann@1: +/* Perform machine dependent cif processing */ yann@1: +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) yann@1: +{ yann@1: + int i, j; yann@1: + int size, type; yann@1: + int n, m; yann@1: + int greg; yann@1: +#if defined(__SH4__) yann@1: + int freg = 0; yann@1: +#endif yann@1: + yann@1: + cif->flags = 0; yann@1: + yann@1: + greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && yann@1: + STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; yann@1: + yann@1: +#if defined(__SH4__) yann@1: + for (i = j = 0; i < cif->nargs && j < 12; i++) yann@1: + { yann@1: + type = (cif->arg_types)[i]->type; yann@1: + switch (type) yann@1: + { yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (freg >= NFREGARG) yann@1: + continue; yann@1: + freg++; yann@1: + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); yann@1: + j++; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + if ((freg + 1) >= NFREGARG) yann@1: + continue; yann@1: + freg = (freg + 1) & ~1; yann@1: + freg += 2; yann@1: + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); yann@1: + j++; yann@1: + break; yann@1: + yann@1: + default: yann@1: + size = (cif->arg_types)[i]->size; yann@1: + n = (size + sizeof (int) - 1) / sizeof (int); yann@1: + if (greg + n - 1 >= NGREGARG) yann@1: + continue; yann@1: + greg += n; yann@1: + for (m = 0; m < n; m++) yann@1: + cif->flags += FFI_TYPE_INT << (2 * j++); yann@1: + break; yann@1: + } yann@1: + } yann@1: +#else yann@1: + for (i = j = 0; i < cif->nargs && j < 4; i++) yann@1: + { yann@1: + size = (cif->arg_types)[i]->size; yann@1: + n = (size + sizeof (int) - 1) / sizeof (int); yann@1: + if (greg >= NGREGARG) yann@1: + continue; yann@1: + else if (greg + n - 1 >= NGREGARG) yann@1: + greg = NGREGARG; yann@1: + else yann@1: + greg += n; yann@1: + for (m = 0; m < n; m++) yann@1: + cif->flags += FFI_TYPE_INT << (2 * j++); yann@1: + } yann@1: +#endif yann@1: + yann@1: + /* Set the return type flag */ yann@1: + switch (cif->rtype->type) yann@1: + { yann@1: + case FFI_TYPE_STRUCT: yann@1: + cif->flags += (unsigned) (return_type (cif->rtype)) << 24; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_VOID: yann@1: + case FFI_TYPE_FLOAT: yann@1: + case FFI_TYPE_DOUBLE: yann@1: + case FFI_TYPE_SINT64: yann@1: + case FFI_TYPE_UINT64: yann@1: + cif->flags += (unsigned) cif->rtype->type << 24; yann@1: + break; yann@1: + yann@1: + default: yann@1: + cif->flags += FFI_TYPE_INT << 24; yann@1: + break; yann@1: + } yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +/*@-declundef@*/ yann@1: +/*@-exportheader@*/ yann@1: +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), yann@1: + /*@out@*/ extended_cif *, yann@1: + unsigned, unsigned, yann@1: + /*@out@*/ unsigned *, yann@1: + void (*fn)()); yann@1: +/*@=declundef@*/ yann@1: +/*@=exportheader@*/ yann@1: + yann@1: +void ffi_call(/*@dependent@*/ ffi_cif *cif, yann@1: + void (*fn)(), yann@1: + /*@out@*/ void *rvalue, yann@1: + /*@dependent@*/ void **avalue) yann@1: +{ yann@1: + extended_cif ecif; yann@1: + yann@1: + ecif.cif = cif; yann@1: + ecif.avalue = avalue; yann@1: + yann@1: + /* If the return value is a struct and we don't have a return */ yann@1: + /* value address then we need to make one */ yann@1: + yann@1: + if ((rvalue == NULL) && yann@1: + (cif->rtype->type == FFI_TYPE_STRUCT)) yann@1: + { yann@1: + /*@-sysunrecog@*/ yann@1: + ecif.rvalue = alloca(cif->rtype->size); yann@1: + /*@=sysunrecog@*/ yann@1: + } yann@1: + else yann@1: + ecif.rvalue = rvalue; yann@1: + yann@1: + yann@1: + switch (cif->abi) yann@1: + { yann@1: + case FFI_SYSV: yann@1: + /*@-usedef@*/ yann@1: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, yann@1: + cif->flags, ecif.rvalue, fn); yann@1: + /*@=usedef@*/ yann@1: + break; yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + break; yann@1: + } yann@1: +} yann@1: + yann@1: +extern void ffi_closure_SYSV (void); yann@1: +#if defined(__SH4__) yann@1: +extern void __ic_invalidate (void *line); yann@1: +#endif yann@1: + yann@1: +ffi_status yann@1: +ffi_prep_closure (ffi_closure* closure, yann@1: + ffi_cif* cif, yann@1: + void (*fun)(ffi_cif*, void*, void**, void*), yann@1: + void *user_data) yann@1: +{ yann@1: + unsigned int *tramp; yann@1: + yann@1: + FFI_ASSERT (cif->abi == FFI_GCC_SYSV); yann@1: + yann@1: + tramp = (unsigned int *) &closure->tramp[0]; yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + tramp[0] = 0xd301d202; yann@1: + tramp[1] = 0x0009422b; yann@1: +#else yann@1: + tramp[0] = 0xd202d301; yann@1: + tramp[1] = 0x422b0009; yann@1: +#endif yann@1: + *(void **) &tramp[2] = (void *)closure; /* ctx */ yann@1: + *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ yann@1: + yann@1: + closure->cif = cif; yann@1: + closure->fun = fun; yann@1: + closure->user_data = user_data; yann@1: + yann@1: +#if defined(__SH4__) yann@1: + /* Flush the icache. */ yann@1: + __ic_invalidate(&closure->tramp[0]); yann@1: +#endif yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +/* Basically the trampoline invokes ffi_closure_SYSV, and on yann@1: + * entry, r3 holds the address of the closure. yann@1: + * After storing the registers that could possibly contain yann@1: + * parameters to be passed into the stack frame and setting yann@1: + * up space for a return value, ffi_closure_SYSV invokes the yann@1: + * following helper function to do most of the work. yann@1: + */ yann@1: + yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: +#define OFS_INT8 0 yann@1: +#define OFS_INT16 2 yann@1: +#else yann@1: +#define OFS_INT8 3 yann@1: +#define OFS_INT16 2 yann@1: +#endif yann@1: + yann@1: +int yann@1: +ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, yann@1: + unsigned long *pgr, unsigned long *pfr, yann@1: + unsigned long *pst) yann@1: +{ yann@1: + void **avalue; yann@1: + ffi_type **p_arg; yann@1: + int i, avn; yann@1: + int ireg, greg = 0; yann@1: +#if defined(__SH4__) yann@1: + int freg = 0; yann@1: +#endif yann@1: + ffi_cif *cif; yann@1: + double temp; yann@1: + yann@1: + cif = closure->cif; yann@1: + avalue = alloca(cif->nargs * sizeof(void *)); yann@1: + yann@1: + /* Copy the caller's structure return value address so that the closure yann@1: + returns the data directly to the caller. */ yann@1: + if (cif->rtype->type == FFI_TYPE_STRUCT) yann@1: + { yann@1: + rvalue = *pgr++; yann@1: + ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; yann@1: + } yann@1: + else yann@1: + ireg = 0; yann@1: + yann@1: + cif = closure->cif; yann@1: + greg = ireg; yann@1: + avn = cif->nargs; yann@1: + yann@1: + /* Grab the addresses of the arguments from the stack frame. */ yann@1: + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) yann@1: + { yann@1: + size_t z; yann@1: + yann@1: + z = (*p_arg)->size; yann@1: + if (z < sizeof(int)) yann@1: + { yann@1: + if (greg++ >= NGREGARG) yann@1: + continue; yann@1: + yann@1: + z = sizeof(int); yann@1: + switch ((*p_arg)->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_UINT8: yann@1: + avalue[i] = (((char *)pgr) + OFS_INT8); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT16: yann@1: + avalue[i] = (((char *)pgr) + OFS_INT16); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_STRUCT: yann@1: + avalue[i] = pgr; yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + pgr++; yann@1: + } yann@1: + else if (z == sizeof(int)) yann@1: + { yann@1: +#if defined(__SH4__) yann@1: + if ((*p_arg)->type == FFI_TYPE_FLOAT) yann@1: + { yann@1: + if (freg++ >= NFREGARG) yann@1: + continue; yann@1: + avalue[i] = pfr; yann@1: + pfr++; yann@1: + } yann@1: + else yann@1: +#endif yann@1: + { yann@1: + if (greg++ >= NGREGARG) yann@1: + continue; yann@1: + avalue[i] = pgr; yann@1: + pgr++; yann@1: + } yann@1: + } yann@1: +#if defined(__SH4__) yann@1: + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) yann@1: + { yann@1: + if (freg + 1 >= NFREGARG) yann@1: + continue; yann@1: + freg = (freg + 1) & ~1; yann@1: + freg += 2; yann@1: + avalue[i] = pfr; yann@1: + pfr += 2; yann@1: + } yann@1: +#endif yann@1: + else yann@1: + { yann@1: + int n = (z + sizeof (int) - 1) / sizeof (int); yann@1: +#if defined(__SH4__) yann@1: + if (greg + n - 1 >= NGREGARG) yann@1: + continue; yann@1: + greg += n; yann@1: +#else yann@1: + if (greg >= NGREGARG) yann@1: + continue; yann@1: + else if (greg + n - 1 >= NGREGARG) yann@1: + greg = NGREGARG; yann@1: + else yann@1: + greg += n; yann@1: +#endif yann@1: + avalue[i] = pgr; yann@1: + pgr += n; yann@1: + } yann@1: + } yann@1: + yann@1: + greg = ireg; yann@1: +#if defined(__SH4__) yann@1: + freg = 0; yann@1: +#endif yann@1: + yann@1: + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) yann@1: + { yann@1: + size_t z; yann@1: + yann@1: + z = (*p_arg)->size; yann@1: + if (z < sizeof(int)) yann@1: + { yann@1: + if (greg++ < NGREGARG) yann@1: + continue; yann@1: + yann@1: + z = sizeof(int); yann@1: + switch ((*p_arg)->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_UINT8: yann@1: + avalue[i] = (((char *)pst) + OFS_INT8); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT16: yann@1: + avalue[i] = (((char *)pst) + OFS_INT16); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_STRUCT: yann@1: + avalue[i] = pst; yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + pst++; yann@1: + } yann@1: + else if (z == sizeof(int)) yann@1: + { yann@1: +#if defined(__SH4__) yann@1: + if ((*p_arg)->type == FFI_TYPE_FLOAT) yann@1: + { yann@1: + if (freg++ < NFREGARG) yann@1: + continue; yann@1: + } yann@1: + else yann@1: +#endif yann@1: + { yann@1: + if (greg++ < NGREGARG) yann@1: + continue; yann@1: + } yann@1: + avalue[i] = pst; yann@1: + pst++; yann@1: + } yann@1: +#if defined(__SH4__) yann@1: + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) yann@1: + { yann@1: + if (freg + 1 < NFREGARG) yann@1: + { yann@1: + freg = (freg + 1) & ~1; yann@1: + freg += 2; yann@1: + continue; yann@1: + } yann@1: + avalue[i] = pst; yann@1: + pst += 2; yann@1: + } yann@1: +#endif yann@1: + else yann@1: + { yann@1: + int n = (z + sizeof (int) - 1) / sizeof (int); yann@1: + if (greg + n - 1 < NGREGARG) yann@1: + { yann@1: + greg += n; yann@1: + continue; yann@1: + } yann@1: +#if (! defined(__SH4__)) yann@1: + else if (greg < NGREGARG) yann@1: + { yann@1: + greg = NGREGARG; yann@1: + continue; yann@1: + } yann@1: +#endif yann@1: + avalue[i] = pst; yann@1: + pst += n; yann@1: + } yann@1: + } yann@1: + yann@1: + (closure->fun) (cif, rvalue, avalue, closure->user_data); yann@1: + yann@1: + /* Tell ffi_closure_osf how to perform return type promotions. */ yann@1: + return cif->rtype->type; yann@1: +} yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S yann@1: --- gcc-3.2.2.orig/libffi/src/sh/sysv.S Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/sh/sysv.S Tue Dec 17 03:22:48 2002 yann@1: @@ -0,0 +1,773 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + sysv.S - Copyright (c) 2002 Kaz Kojima yann@1: + yann@1: + SuperH Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: + yann@1: +#define LIBFFI_ASM yann@1: +#include yann@1: +#ifdef HAVE_MACHINE_ASM_H yann@1: +#include yann@1: +#else yann@1: +/* XXX these lose for some platforms, I'm sure. */ yann@1: +#define CNAME(x) x yann@1: +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): yann@1: +#endif yann@1: + yann@1: +#if defined(__HITACHI__) yann@1: +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 yann@1: +#else yann@1: +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 yann@1: +#endif yann@1: + yann@1: +.text yann@1: + yann@1: + # r4: ffi_prep_args yann@1: + # r5: &ecif yann@1: + # r6: bytes yann@1: + # r7: flags yann@1: + # sp+0: rvalue yann@1: + # sp+4: fn yann@1: + yann@1: + # This assumes we are using gas. yann@1: +ENTRY(ffi_call_SYSV) yann@1: + # Save registers yann@1: +.LFB1: yann@1: + mov.l r8,@-r15 yann@1: +.LCFI0: yann@1: + mov.l r9,@-r15 yann@1: +.LCFI1: yann@1: + mov.l r10,@-r15 yann@1: +.LCFI2: yann@1: + mov.l r12,@-r15 yann@1: +.LCFI3: yann@1: + mov.l r14,@-r15 yann@1: +.LCFI4: yann@1: + sts.l pr,@-r15 yann@1: +.LCFI5: yann@1: + mov r15,r14 yann@1: +.LCFI6: yann@1: +#if defined(__SH4__) yann@1: + mov r6,r8 yann@1: + mov r7,r9 yann@1: + yann@1: + sub r6,r15 yann@1: + add #-16,r15 yann@1: + mov #~7,r0 yann@1: + and r0,r15 yann@1: + yann@1: + mov r4,r0 yann@1: + jsr @r0 yann@1: + mov r15,r4 yann@1: + yann@1: + mov r9,r1 yann@1: + shlr8 r9 yann@1: + shlr8 r9 yann@1: + shlr8 r9 yann@1: + yann@1: + mov #FFI_TYPE_STRUCT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf 1f yann@1: +#if STRUCT_VALUE_ADDRESS_WITH_ARG yann@1: + mov.l @r15+,r4 yann@1: + bra 2f yann@1: + mov #5,r2 yann@1: +#else yann@1: + mov.l @r15+,r10 yann@1: +#endif yann@1: +1: yann@1: + mov #4,r2 yann@1: +2: yann@1: + mov #4,r3 yann@1: + yann@1: +L_pass: yann@1: + cmp/pl r8 yann@1: + bf L_call_it yann@1: + yann@1: + mov r1,r0 yann@1: + and #3,r0 yann@1: + yann@1: +L_pass_d: yann@1: + cmp/eq #FFI_TYPE_DOUBLE,r0 yann@1: + bf L_pass_f yann@1: + yann@1: + mov r3,r0 yann@1: + and #1,r0 yann@1: + tst r0,r0 yann@1: + bt 1f yann@1: + add #1,r3 yann@1: +1: yann@1: + mov r15,r0 yann@1: + and #7,r0 yann@1: + tst r0,r0 yann@1: + bt 2f yann@1: + add #4,r15 yann@1: +2: yann@1: + mov #12,r0 yann@1: + cmp/hs r0,r3 yann@1: + bt/s 3f yann@1: + shlr2 r1 yann@1: + bsr L_pop_d yann@1: + nop yann@1: +3: yann@1: + add #2,r3 yann@1: + bra L_pass yann@1: + add #-8,r8 yann@1: + yann@1: +L_pop_d: yann@1: + mov r3,r0 yann@1: + add r0,r0 yann@1: + add r3,r0 yann@1: + add #-12,r0 yann@1: + braf r0 yann@1: + nop yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + fmov.s @r15+,fr5 yann@1: + rts yann@1: + fmov.s @r15+,fr4 yann@1: + fmov.s @r15+,fr7 yann@1: + rts yann@1: + fmov.s @r15+,fr6 yann@1: + fmov.s @r15+,fr9 yann@1: + rts yann@1: + fmov.s @r15+,fr8 yann@1: + fmov.s @r15+,fr11 yann@1: + rts yann@1: + fmov.s @r15+,fr10 yann@1: +#else yann@1: + fmov.s @r15+,fr4 yann@1: + rts yann@1: + fmov.s @r15+,fr5 yann@1: + fmov.s @r15+,fr6 yann@1: + rts yann@1: + fmov.s @r15+,fr7 yann@1: + fmov.s @r15+,fr8 yann@1: + rts yann@1: + fmov.s @r15+,fr9 yann@1: + fmov.s @r15+,fr10 yann@1: + rts yann@1: + fmov.s @r15+,fr11 yann@1: +#endif yann@1: + yann@1: +L_pass_f: yann@1: + cmp/eq #FFI_TYPE_FLOAT,r0 yann@1: + bf L_pass_i yann@1: + yann@1: + mov #12,r0 yann@1: + cmp/hs r0,r3 yann@1: + bt/s 2f yann@1: + shlr2 r1 yann@1: + bsr L_pop_f yann@1: + nop yann@1: +2: yann@1: + add #1,r3 yann@1: + bra L_pass yann@1: + add #-4,r8 yann@1: + yann@1: +L_pop_f: yann@1: + mov r3,r0 yann@1: + shll2 r0 yann@1: + add #-16,r0 yann@1: + braf r0 yann@1: + nop yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + rts yann@1: + fmov.s @r15+,fr5 yann@1: + rts yann@1: + fmov.s @r15+,fr4 yann@1: + rts yann@1: + fmov.s @r15+,fr7 yann@1: + rts yann@1: + fmov.s @r15+,fr6 yann@1: + rts yann@1: + fmov.s @r15+,fr9 yann@1: + rts yann@1: + fmov.s @r15+,fr8 yann@1: + rts yann@1: + fmov.s @r15+,fr11 yann@1: + rts yann@1: + fmov.s @r15+,fr10 yann@1: +#else yann@1: + rts yann@1: + fmov.s @r15+,fr4 yann@1: + rts yann@1: + fmov.s @r15+,fr5 yann@1: + rts yann@1: + fmov.s @r15+,fr6 yann@1: + rts yann@1: + fmov.s @r15+,fr7 yann@1: + rts yann@1: + fmov.s @r15+,fr8 yann@1: + rts yann@1: + fmov.s @r15+,fr9 yann@1: + rts yann@1: + fmov.s @r15+,fr10 yann@1: + rts yann@1: + fmov.s @r15+,fr11 yann@1: +#endif yann@1: + yann@1: +L_pass_i: yann@1: + cmp/eq #FFI_TYPE_INT,r0 yann@1: + bf L_call_it yann@1: + yann@1: + mov #8,r0 yann@1: + cmp/hs r0,r2 yann@1: + bt/s 2f yann@1: + shlr2 r1 yann@1: + bsr L_pop_i yann@1: + nop yann@1: +2: yann@1: + add #1,r2 yann@1: + bra L_pass yann@1: + add #-4,r8 yann@1: + yann@1: +L_pop_i: yann@1: + mov r2,r0 yann@1: + shll2 r0 yann@1: + add #-16,r0 yann@1: + braf r0 yann@1: + nop yann@1: + rts yann@1: + mov.l @r15+,r4 yann@1: + rts yann@1: + mov.l @r15+,r5 yann@1: + rts yann@1: + mov.l @r15+,r6 yann@1: + rts yann@1: + mov.l @r15+,r7 yann@1: + yann@1: +L_call_it: yann@1: + # call function yann@1: +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) yann@1: + mov r10, r2 yann@1: +#endif yann@1: + mov.l @(28,r14),r1 yann@1: + jsr @r1 yann@1: + nop yann@1: + yann@1: +L_ret_d: yann@1: + mov #FFI_TYPE_DOUBLE,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_ret_ll yann@1: + yann@1: + mov.l @(24,r14),r1 yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + fmov.s fr1,@r1 yann@1: + add #4,r1 yann@1: + bra L_epilogue yann@1: + fmov.s fr0,@r1 yann@1: +#else yann@1: + fmov.s fr0,@r1 yann@1: + add #4,r1 yann@1: + bra L_epilogue yann@1: + fmov.s fr1,@r1 yann@1: +#endif yann@1: + yann@1: +L_ret_ll: yann@1: + mov #FFI_TYPE_SINT64,r2 yann@1: + cmp/eq r2,r9 yann@1: + bt/s 1f yann@1: + mov #FFI_TYPE_UINT64,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_ret_f yann@1: + yann@1: +1: yann@1: + mov.l @(24,r14),r2 yann@1: + mov.l r0,@r2 yann@1: + bra L_epilogue yann@1: + mov.l r1,@(4,r2) yann@1: + yann@1: +L_ret_f: yann@1: + mov #FFI_TYPE_FLOAT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_ret_i yann@1: + yann@1: + mov.l @(24,r14),r1 yann@1: + bra L_epilogue yann@1: + fmov.s fr0,@r1 yann@1: + yann@1: +L_ret_i: yann@1: + mov #FFI_TYPE_INT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_epilogue yann@1: + yann@1: + mov.l @(24,r14),r1 yann@1: + bra L_epilogue yann@1: + mov.l r0,@r1 yann@1: + yann@1: +L_epilogue: yann@1: + # Remove the space we pushed for the args yann@1: + mov r14,r15 yann@1: + yann@1: + lds.l @r15+,pr yann@1: + mov.l @r15+,r14 yann@1: + mov.l @r15+,r12 yann@1: + mov.l @r15+,r10 yann@1: + mov.l @r15+,r9 yann@1: + rts yann@1: + mov.l @r15+,r8 yann@1: +#else yann@1: + mov r6,r8 yann@1: + mov r7,r9 yann@1: + yann@1: + sub r6,r15 yann@1: + add #-16,r15 yann@1: + mov #~7,r0 yann@1: + and r0,r15 yann@1: + yann@1: + mov r4,r0 yann@1: + jsr @r0 yann@1: + mov r15,r4 yann@1: + yann@1: + mov r9,r3 yann@1: + shlr8 r9 yann@1: + shlr8 r9 yann@1: + shlr8 r9 yann@1: + yann@1: + mov #FFI_TYPE_STRUCT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf 1f yann@1: +#if STRUCT_VALUE_ADDRESS_WITH_ARG yann@1: + mov.l @r15+,r4 yann@1: + bra 2f yann@1: + mov #5,r2 yann@1: +#else yann@1: + mov.l @r15+,r10 yann@1: +#endif yann@1: +1: yann@1: + mov #4,r2 yann@1: +2: yann@1: + yann@1: +L_pass: yann@1: + cmp/pl r8 yann@1: + bf L_call_it yann@1: + yann@1: + mov r3,r0 yann@1: + and #3,r0 yann@1: + yann@1: +L_pass_d: yann@1: + cmp/eq #FFI_TYPE_DOUBLE,r0 yann@1: + bf L_pass_i yann@1: + yann@1: + mov r15,r0 yann@1: + and #7,r0 yann@1: + tst r0,r0 yann@1: + bt 1f yann@1: + add #4,r15 yann@1: +1: yann@1: + mov #8,r0 yann@1: + cmp/hs r0,r2 yann@1: + bt/s 2f yann@1: + shlr2 r3 yann@1: + bsr L_pop_d yann@1: + nop yann@1: +2: yann@1: + add #2,r2 yann@1: + bra L_pass yann@1: + add #-8,r8 yann@1: + yann@1: +L_pop_d: yann@1: + mov r2,r0 yann@1: + add r0,r0 yann@1: + add r2,r0 yann@1: + add #-12,r0 yann@1: + add r0,r0 yann@1: + braf r0 yann@1: + nop yann@1: + mov.l @r15+,r4 yann@1: + rts yann@1: + mov.l @r15+,r5 yann@1: + mov.l @r15+,r5 yann@1: + rts yann@1: + mov.l @r15+,r6 yann@1: + mov.l @r15+,r6 yann@1: + rts yann@1: + mov.l @r15+,r7 yann@1: + rts yann@1: + mov.l @r15+,r7 yann@1: + yann@1: +L_pass_i: yann@1: + mov #8,r0 yann@1: + cmp/hs r0,r2 yann@1: + bt/s 2f yann@1: + shlr2 r3 yann@1: + bsr L_pop_i yann@1: + nop yann@1: +2: yann@1: + add #1,r2 yann@1: + bra L_pass yann@1: + add #-4,r8 yann@1: + yann@1: +L_pop_i: yann@1: + mov r2,r0 yann@1: + shll2 r0 yann@1: + add #-16,r0 yann@1: + braf r0 yann@1: + nop yann@1: + rts yann@1: + mov.l @r15+,r4 yann@1: + rts yann@1: + mov.l @r15+,r5 yann@1: + rts yann@1: + mov.l @r15+,r6 yann@1: + rts yann@1: + mov.l @r15+,r7 yann@1: + yann@1: +L_call_it: yann@1: + # call function yann@1: +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) yann@1: + mov r10, r2 yann@1: +#endif yann@1: + mov.l @(28,r14),r1 yann@1: + jsr @r1 yann@1: + nop yann@1: + yann@1: +L_ret_d: yann@1: + mov #FFI_TYPE_DOUBLE,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_ret_ll yann@1: + yann@1: + mov.l @(24,r14),r2 yann@1: + mov.l r0,@r2 yann@1: + bra L_epilogue yann@1: + mov.l r1,@(4,r2) yann@1: + yann@1: +L_ret_ll: yann@1: + mov #FFI_TYPE_SINT64,r2 yann@1: + cmp/eq r2,r9 yann@1: + bt/s 1f yann@1: + mov #FFI_TYPE_UINT64,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_ret_i yann@1: + yann@1: +1: yann@1: + mov.l @(24,r14),r2 yann@1: + mov.l r0,@r2 yann@1: + bra L_epilogue yann@1: + mov.l r1,@(4,r2) yann@1: + yann@1: +L_ret_i: yann@1: + mov #FFI_TYPE_FLOAT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bt 1f yann@1: + mov #FFI_TYPE_INT,r2 yann@1: + cmp/eq r2,r9 yann@1: + bf L_epilogue yann@1: +1: yann@1: + mov.l @(24,r14),r1 yann@1: + bra L_epilogue yann@1: + mov.l r0,@r1 yann@1: + yann@1: +L_epilogue: yann@1: + # Remove the space we pushed for the args yann@1: + mov r14,r15 yann@1: + yann@1: + lds.l @r15+,pr yann@1: + mov.l @r15+,r14 yann@1: + mov.l @r15+,r12 yann@1: + mov.l @r15+,r10 yann@1: + mov.l @r15+,r9 yann@1: + rts yann@1: + mov.l @r15+,r8 yann@1: +#endif yann@1: +.LFE1: yann@1: +.ffi_call_SYSV_end: yann@1: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) yann@1: + yann@1: +.globl ffi_closure_helper_SYSV yann@1: + yann@1: +ENTRY(ffi_closure_SYSV) yann@1: +.LFB2: yann@1: + mov.l r14,@-r15 yann@1: +.LCFI7: yann@1: + sts.l pr,@-r15 yann@1: + yann@1: + /* Stack layout: yann@1: + ... yann@1: + 32 bytes (floating register parameters, SH-4 only) yann@1: + 16 bytes (register parameters) yann@1: + 4 bytes (result) yann@1: + 4 bytes (5th arg) yann@1: + <- new stack pointer yann@1: + */ yann@1: +.LCFI8: yann@1: +#if defined(__SH4__) yann@1: + add #-56,r15 yann@1: +#else yann@1: + add #-24,r15 yann@1: +#endif yann@1: +.LCFI9: yann@1: + mov r15,r14 yann@1: +.LCFIA: yann@1: + mov r14,r1 yann@1: + add #24,r1 yann@1: + mov.l r7,@-r1 yann@1: + mov.l r6,@-r1 yann@1: + mov.l r5,@-r1 yann@1: + mov.l r4,@-r1 yann@1: + mov r1,r6 yann@1: + yann@1: +#if defined(__SH4__) yann@1: + mov r14,r1 yann@1: + add #56,r1 yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + fmov.s fr10,@-r1 yann@1: + fmov.s fr11,@-r1 yann@1: + fmov.s fr8,@-r1 yann@1: + fmov.s fr9,@-r1 yann@1: + fmov.s fr6,@-r1 yann@1: + fmov.s fr7,@-r1 yann@1: + fmov.s fr4,@-r1 yann@1: + fmov.s fr5,@-r1 yann@1: +#else yann@1: + fmov.s fr11,@-r1 yann@1: + fmov.s fr10,@-r1 yann@1: + fmov.s fr9,@-r1 yann@1: + fmov.s fr8,@-r1 yann@1: + fmov.s fr7,@-r1 yann@1: + fmov.s fr6,@-r1 yann@1: + fmov.s fr5,@-r1 yann@1: + fmov.s fr4,@-r1 yann@1: +#endif yann@1: + mov r1,r7 yann@1: +#endif yann@1: + yann@1: + mov r14,r1 yann@1: + add #4,r1 yann@1: + mov r1,r5 yann@1: + yann@1: + mov r14,r1 yann@1: +#if defined(__SH4__) yann@1: + add #64,r1 yann@1: +#else yann@1: + add #32,r1 yann@1: +#endif yann@1: + mov.l r1,@r14 yann@1: + yann@1: + mov.l L_helper,r0 yann@1: + jsr @r0 yann@1: + mov r3,r4 yann@1: + yann@1: + shll r0 yann@1: + mov r0,r1 yann@1: + mova L_table,r0 yann@1: + add r1,r0 yann@1: + mov.w @r0,r0 yann@1: + mov r14,r2 yann@1: + braf r0 yann@1: + add #4,r2 yann@1: +0: yann@1: + .align 2 yann@1: +L_helper: yann@1: + .long ffi_closure_helper_SYSV yann@1: +L_table: yann@1: + .short L_case_v - 0b /* FFI_TYPE_VOID */ yann@1: + .short L_case_i - 0b /* FFI_TYPE_INT */ yann@1: +#if defined(__SH4__) yann@1: + .short L_case_f - 0b /* FFI_TYPE_FLOAT */ yann@1: + .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ yann@1: + .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ yann@1: +#else yann@1: + .short L_case_i - 0b /* FFI_TYPE_FLOAT */ yann@1: + .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ yann@1: + .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ yann@1: +#endif yann@1: + .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ yann@1: + .short L_case_q - 0b /* FFI_TYPE_SINT8 */ yann@1: + .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ yann@1: + .short L_case_h - 0b /* FFI_TYPE_SINT16 */ yann@1: + .short L_case_i - 0b /* FFI_TYPE_UINT32 */ yann@1: + .short L_case_i - 0b /* FFI_TYPE_SINT32 */ yann@1: + .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ yann@1: + .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ yann@1: + .short L_case_v - 0b /* FFI_TYPE_STRUCT */ yann@1: + .short L_case_i - 0b /* FFI_TYPE_POINTER */ yann@1: + yann@1: +#if defined(__SH4__) yann@1: +L_case_d: yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: + fmov.s @r2+,fr1 yann@1: + bra L_case_v yann@1: + fmov.s @r2,fr0 yann@1: +#else yann@1: + fmov.s @r2+,fr0 yann@1: + bra L_case_v yann@1: + fmov.s @r2,fr1 yann@1: +#endif yann@1: + yann@1: +L_case_f: yann@1: + bra L_case_v yann@1: + fmov.s @r2,fr0 yann@1: +#endif yann@1: + yann@1: +L_case_ll: yann@1: + mov.l @r2+,r0 yann@1: + bra L_case_v yann@1: + mov.l @r2,r1 yann@1: + yann@1: +L_case_i: yann@1: + bra L_case_v yann@1: + mov.l @r2,r0 yann@1: + yann@1: +L_case_q: yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: +#else yann@1: + add #3,r2 yann@1: +#endif yann@1: + bra L_case_v yann@1: + mov.b @r2,r0 yann@1: + yann@1: +L_case_uq: yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: +#else yann@1: + add #3,r2 yann@1: +#endif yann@1: + mov.b @r2,r0 yann@1: + bra L_case_v yann@1: + extu.b r0,r0 yann@1: + yann@1: +L_case_h: yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: +#else yann@1: + add #2,r2 yann@1: +#endif yann@1: + bra L_case_v yann@1: + mov.w @r2,r0 yann@1: + yann@1: +L_case_uh: yann@1: +#ifdef __LITTLE_ENDIAN__ yann@1: +#else yann@1: + add #2,r2 yann@1: +#endif yann@1: + mov.w @r2,r0 yann@1: + extu.w r0,r0 yann@1: + /* fall through */ yann@1: + yann@1: +L_case_v: yann@1: +#if defined(__SH4__) yann@1: + add #56,r15 yann@1: +#else yann@1: + add #24,r15 yann@1: +#endif yann@1: + lds.l @r15+,pr yann@1: + rts yann@1: + mov.l @r15+,r14 yann@1: +.LFE2: yann@1: +.ffi_closure_SYSV_end: yann@1: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) yann@1: + yann@1: + .section ".eh_frame","aw",@progbits yann@1: +__FRAME_BEGIN__: yann@1: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ yann@1: +.LSCIE1: yann@1: + .4byte 0x0 /* CIE Identifier Tag */ yann@1: + .byte 0x1 /* CIE Version */ yann@1: + .byte 0x0 /* CIE Augmentation */ yann@1: + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ yann@1: + .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ yann@1: + .byte 0x11 /* CIE RA Column */ yann@1: + .byte 0xc /* DW_CFA_def_cfa */ yann@1: + .byte 0xf /* uleb128 0xf */ yann@1: + .byte 0x0 /* uleb128 0x0 */ yann@1: + .align 2 yann@1: +.LECIE1: yann@1: +.LSFDE1: yann@1: + .4byte .LEFDE1-.LASFDE1 /* FDE Length */ yann@1: +.LASFDE1: yann@1: + .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ yann@1: + .4byte .LFB1 /* FDE initial location */ yann@1: + .4byte .LFE1-.LFB1 /* FDE address range */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI0-.LFB1 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x4 /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI1-.LCFI0 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x8 /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI2-.LCFI1 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0xc /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI3-.LCFI2 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x10 /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI4-.LCFI3 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x14 /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI5-.LCFI4 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x18 /* uleb128 0x4 */ yann@1: + .byte 0x91 /* DW_CFA_offset, column 0x11 */ yann@1: + .byte 0x6 /* uleb128 0x6 */ yann@1: + .byte 0x8e /* DW_CFA_offset, column 0xe */ yann@1: + .byte 0x5 /* uleb128 0x5 */ yann@1: + .byte 0x8c /* DW_CFA_offset, column 0xc */ yann@1: + .byte 0x4 /* uleb128 0x4 */ yann@1: + .byte 0x8a /* DW_CFA_offset, column 0xa */ yann@1: + .byte 0x3 /* uleb128 0x3 */ yann@1: + .byte 0x89 /* DW_CFA_offset, column 0x9 */ yann@1: + .byte 0x2 /* uleb128 0x2 */ yann@1: + .byte 0x88 /* DW_CFA_offset, column 0x8 */ yann@1: + .byte 0x1 /* uleb128 0x1 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI6-.LCFI5 yann@1: + .byte 0xd /* DW_CFA_def_cfa_register */ yann@1: + .byte 0xe /* uleb128 0xe */ yann@1: + .align 2 yann@1: +.LEFDE1: yann@1: + yann@1: +.LSFDE3: yann@1: + .4byte .LEFDE3-.LASFDE3 /* FDE Length */ yann@1: +.LASFDE3: yann@1: + .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ yann@1: + .4byte .LFB2 /* FDE initial location */ yann@1: + .4byte .LFE2-.LFB2 /* FDE address range */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI7-.LFB2 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x4 /* uleb128 0x4 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI8-.LCFI7 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: + .byte 0x8 /* uleb128 0x8 */ yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFI9-.LCFI8 yann@1: + .byte 0xe /* DW_CFA_def_cfa_offset */ yann@1: +#if defined(__SH4__) yann@1: + .byte 8+56 /* uleb128 8+56 */ yann@1: +#else yann@1: + .byte 8+24 /* uleb128 8+24 */ yann@1: +#endif yann@1: + .byte 0x91 /* DW_CFA_offset, column 0x11 */ yann@1: + .byte 0x2 yann@1: + .byte 0x8e /* DW_CFA_offset, column 0xe */ yann@1: + .byte 0x1 yann@1: + .byte 0x4 /* DW_CFA_advance_loc4 */ yann@1: + .4byte .LCFIA-.LCFI9 yann@1: + .byte 0xd /* DW_CFA_def_cfa_register */ yann@1: + .byte 0xe /* uleb128 0xe */ yann@1: + .align 2 yann@1: +.LEFDE3: yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/sparc/ffi.c Sat Mar 3 07:21:23 2001 yann@1: +++ gcc/libffi/src/sparc/ffi.c Sat Jan 4 08:08:56 2003 yann@1: @@ -1,5 +1,5 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - ffi.c - Copyright (c) 1996 Cygnus Solutions yann@1: + ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions yann@1: yann@1: Sparc Foreign Function Interface yann@1: yann@1: @@ -28,20 +28,22 @@ yann@1: yann@1: #include yann@1: yann@1: +#ifdef SPARC64 yann@1: +extern void ffi_closure_v9(void); yann@1: +#else yann@1: +extern void ffi_closure_v8(void); yann@1: +#endif yann@1: + yann@1: /* ffi_prep_args is called by the assembly routine once stack space yann@1: has been allocated for the function's arguments */ yann@1: yann@1: void ffi_prep_args_v8(char *stack, extended_cif *ecif) yann@1: { yann@1: int i; yann@1: - int tmp; yann@1: - int avn; yann@1: void **p_argv; yann@1: char *argp; yann@1: ffi_type **p_arg; yann@1: yann@1: - tmp = 0; yann@1: - yann@1: /* Skip 16 words for the window save area */ yann@1: argp = stack + 16*sizeof(int); yann@1: yann@1: @@ -66,18 +68,12 @@ yann@1: ((int*)argp)[5] = 0; yann@1: #endif yann@1: yann@1: - avn = ecif->cif->nargs; yann@1: p_argv = ecif->avalue; yann@1: yann@1: - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; yann@1: - i && avn; yann@1: - i--, p_arg++) yann@1: + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) yann@1: { yann@1: size_t z; yann@1: yann@1: - if (avn) yann@1: - { yann@1: - avn--; yann@1: if ((*p_arg)->type == FFI_TYPE_STRUCT yann@1: #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE yann@1: || (*p_arg)->type == FFI_TYPE_LONGDOUBLE yann@1: @@ -122,7 +118,6 @@ yann@1: } yann@1: p_argv++; yann@1: argp += z; yann@1: - } yann@1: } yann@1: yann@1: return; yann@1: @@ -420,3 +415,101 @@ yann@1: } yann@1: yann@1: } yann@1: + yann@1: +ffi_status yann@1: +ffi_prep_closure (ffi_closure* closure, yann@1: + ffi_cif* cif, yann@1: + void (*fun)(ffi_cif*, void*, void**, void*), yann@1: + void *user_data) yann@1: +{ yann@1: + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; yann@1: + unsigned long fn; yann@1: + unsigned long ctx = (unsigned long) closure; yann@1: + yann@1: +#ifdef SPARC64 yann@1: + /* Trampoline address is equal to the closure address. We take advantage yann@1: + of that to reduce the trampoline size by 8 bytes. */ yann@1: + FFI_ASSERT (cif->abi == FFI_V9); yann@1: + fn = (unsigned long) ffi_closure_v9; yann@1: + tramp[0] = 0x83414000; /* rd %pc, %g1 */ yann@1: + tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ yann@1: + tramp[2] = 0x81c14000; /* jmp %g5 */ yann@1: + tramp[3] = 0x01000000; /* nop */ yann@1: + *((unsigned long *) &tramp[4]) = fn; yann@1: +#else yann@1: + FFI_ASSERT (cif->abi == FFI_V8); yann@1: + fn = (unsigned long) ffi_closure_v8; yann@1: + tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ yann@1: + tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ yann@1: + tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ yann@1: + tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ yann@1: +#endif yann@1: + yann@1: + closure->cif = cif; yann@1: + closure->fun = fun; yann@1: + closure->user_data = user_data; yann@1: + yann@1: + /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */ yann@1: +#ifdef SPARC64 yann@1: + asm volatile ("flush %0" : : "r" (closure) : "memory"); yann@1: + asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory"); yann@1: +#else yann@1: + asm volatile ("iflush %0" : : "r" (closure) : "memory"); yann@1: + asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory"); yann@1: +#endif yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +int yann@1: +ffi_closure_sparc_inner(ffi_closure *closure, yann@1: + void *rvalue, unsigned long *gpr, double *fpr) yann@1: +{ yann@1: + ffi_cif *cif; yann@1: + void **avalue; yann@1: + ffi_type **arg_types; yann@1: + int i, avn, argn; yann@1: + yann@1: + cif = closure->cif; yann@1: + avalue = alloca(cif->nargs * sizeof(void *)); yann@1: + yann@1: + argn = 0; yann@1: + yann@1: + /* Copy the caller's structure return address to that the closure yann@1: + returns the data directly to the caller. */ yann@1: + if (cif->flags == FFI_TYPE_STRUCT) yann@1: + { yann@1: + rvalue = (void *) gpr[0]; yann@1: + argn = 1; yann@1: + } yann@1: + yann@1: + i = 0; yann@1: + avn = cif->nargs; yann@1: + arg_types = cif->arg_types; yann@1: + yann@1: + /* Grab the addresses of the arguments from the stack frame. */ yann@1: + while (i < avn) yann@1: + { yann@1: + /* Assume big-endian. FIXME */ yann@1: + argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG; yann@1: + yann@1: +#ifdef SPARC64 yann@1: + if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT yann@1: + || arg_types[i]->type == FFI_TYPE_DOUBLE yann@1: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE yann@1: + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE yann@1: +#endif yann@1: + )) yann@1: + avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size; yann@1: + else yann@1: +#endif yann@1: + avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; yann@1: + i++; yann@1: + } yann@1: + yann@1: + /* Invoke the closure. */ yann@1: + (closure->fun) (cif, rvalue, avalue, closure->user_data); yann@1: + yann@1: + /* Tell ffi_closure_sparc how to perform return type promotions. */ yann@1: + return cif->rtype->type; yann@1: +} yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S yann@1: --- gcc-3.2.2.orig/libffi/src/sparc/v8.S Mon Apr 29 05:12:04 2002 yann@1: +++ gcc/libffi/src/sparc/v8.S Sat Jan 4 08:08:56 2003 yann@1: @@ -1,5 +1,5 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - v8.S - Copyright (c) 1996, 1997 Cygnus Solutions yann@1: + v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions yann@1: yann@1: Sparc Foreign Function Interface yann@1: yann@1: @@ -94,6 +94,72 @@ yann@1: .ffi_call_V8_end: yann@1: .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8 yann@1: yann@1: + yann@1: +#define STACKFRAME 104 /* 16*4 register window + yann@1: + 1*4 struct return + yann@1: + 6*4 args backing store + yann@1: + 3*4 locals */ yann@1: + yann@1: +/* ffi_closure_v8(...) yann@1: + yann@1: + Receives the closure argument in %g2. */ yann@1: + yann@1: + .text yann@1: + .align 8 yann@1: + .globl ffi_closure_v8 yann@1: + yann@1: +ffi_closure_v8: yann@1: + .register %g2, #scratch yann@1: +.LLFB2: yann@1: + save %sp, -STACKFRAME, %sp yann@1: +.LLCFI1: yann@1: + yann@1: + ! Store all of the potential argument registers in va_list format. yann@1: + st %i0, [%fp+68+0] yann@1: + st %i1, [%fp+68+4] yann@1: + st %i2, [%fp+68+8] yann@1: + st %i3, [%fp+68+12] yann@1: + st %i4, [%fp+68+16] yann@1: + st %i5, [%fp+68+20] yann@1: + yann@1: + ! Call ffi_closure_sparc_inner to do the bulk of the work. yann@1: + mov %g2, %o0 yann@1: + add %fp, -8, %o1 yann@1: + add %fp, 68, %o2 yann@1: + call ffi_closure_sparc_inner yann@1: + mov 0, %o3 yann@1: + yann@1: + ! Load up the return value in the proper type. yann@1: + cmp %o0, FFI_TYPE_VOID yann@1: + be done1 yann@1: + yann@1: + cmp %o0, FFI_TYPE_FLOAT yann@1: + be,a done1 yann@1: + ld [%fp-8], %f0 yann@1: + yann@1: + cmp %o0, FFI_TYPE_DOUBLE yann@1: + be,a done1 yann@1: + ldd [%fp-8], %f0 yann@1: + yann@1: + cmp %o0, FFI_TYPE_SINT64 yann@1: + be,a integer yann@1: + ld [%fp-4], %i1 yann@1: + yann@1: + cmp %o0, FFI_TYPE_UINT64 yann@1: + be,a integer yann@1: + ld [%fp-4], %i1 yann@1: + yann@1: +integer: yann@1: + ld [%fp-8], %i0 yann@1: + yann@1: +done1: yann@1: + ret yann@1: + restore yann@1: +.LLFE2: yann@1: + yann@1: +.ffi_closure_v8_end: yann@1: + .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8 yann@1: + yann@1: #ifdef SPARC64 yann@1: #define WS 8 yann@1: #define nword xword yann@1: @@ -148,3 +214,26 @@ yann@1: .byte 0x1f ! uleb128 0x1f yann@1: .align WS yann@1: .LLEFDE1: yann@1: +.LLSFDE2: yann@1: + .uaword .LLEFDE2-.LLASFDE2 ! FDE Length yann@1: +.LLASFDE2: yann@1: + .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset yann@1: +#ifdef HAVE_AS_SPARC_UA_PCREL yann@1: + .uaword %r_disp32(.LLFB2) yann@1: + .uaword .LLFE2-.LLFB2 ! FDE address range yann@1: +#else yann@1: + .align WS yann@1: + .nword .LLFB2 yann@1: + .uanword .LLFE2-.LLFB2 ! FDE address range yann@1: +#endif yann@1: + .byte 0x0 ! uleb128 0x0; Augmentation size yann@1: + .byte 0x4 ! DW_CFA_advance_loc4 yann@1: + .uaword .LLCFI1-.LLFB2 yann@1: + .byte 0xd ! DW_CFA_def_cfa_register yann@1: + .byte 0x1e ! uleb128 0x1e yann@1: + .byte 0x2d ! DW_CFA_GNU_window_save yann@1: + .byte 0x9 ! DW_CFA_register yann@1: + .byte 0xf ! uleb128 0xf yann@1: + .byte 0x1f ! uleb128 0x1f yann@1: + .align WS yann@1: +.LLEFDE2: yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S yann@1: --- gcc-3.2.2.orig/libffi/src/sparc/v9.S Mon Apr 29 05:12:04 2002 yann@1: +++ gcc/libffi/src/sparc/v9.S Sat Jan 4 08:08:56 2003 yann@1: @@ -1,5 +1,5 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - v9.S - Copyright (c) 2000 Cygnus Solutions yann@1: + v9.S - Copyright (c) 2000, 2003 Cygnus Solutions yann@1: yann@1: Sparc 64bit Foreign Function Interface yann@1: yann@1: @@ -99,7 +99,7 @@ yann@1: cmp %i3, FFI_TYPE_STRUCT yann@1: be,pn %icc, dostruct yann@1: yann@1: - cmp %i3, FFI_TYPE_LONGDOUBLE yann@1: + cmp %i3, FFI_TYPE_LONGDOUBLE yann@1: bne,pt %icc, done yann@1: nop yann@1: std %f0, [%i4+0] yann@1: @@ -125,6 +125,88 @@ yann@1: .ffi_call_V9_end: yann@1: .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9 yann@1: yann@1: + yann@1: +#define STACKFRAME 240 /* 16*8 register window + yann@1: + 6*8 args backing store + yann@1: + 8*8 locals */ yann@1: +#define FP %fp+STACK_BIAS yann@1: + yann@1: +/* ffi_closure_v9(...) yann@1: + yann@1: + Receives the closure argument in %g1. */ yann@1: + yann@1: + .text yann@1: + .align 8 yann@1: + .globl ffi_closure_v9 yann@1: + yann@1: +ffi_closure_v9: yann@1: +.LLFB2: yann@1: + save %sp, -STACKFRAME, %sp yann@1: +.LLCFI1: yann@1: + yann@1: + ! Store all of the potential argument registers in va_list format. yann@1: + stx %i0, [FP+128+0] yann@1: + stx %i1, [FP+128+8] yann@1: + stx %i2, [FP+128+16] yann@1: + stx %i3, [FP+128+24] yann@1: + stx %i4, [FP+128+32] yann@1: + stx %i5, [FP+128+40] yann@1: + yann@1: + ! Store possible floating point argument registers too. yann@1: + std %f0, [FP-48] yann@1: + std %f2, [FP-40] yann@1: + std %f4, [FP-32] yann@1: + std %f6, [FP-24] yann@1: + std %f8, [FP-16] yann@1: + std %f10, [FP-8] yann@1: + yann@1: + ! Call ffi_closure_sparc_inner to do the bulk of the work. yann@1: + mov %g1, %o0 yann@1: + add %fp, STACK_BIAS-64, %o1 yann@1: + add %fp, STACK_BIAS+128, %o2 yann@1: + call ffi_closure_sparc_inner yann@1: + add %fp, STACK_BIAS-48, %o3 yann@1: + yann@1: + ! Load up the return value in the proper type. yann@1: + cmp %o0, FFI_TYPE_VOID yann@1: + be,pn %icc, done1 yann@1: + yann@1: + cmp %o0, FFI_TYPE_FLOAT yann@1: + be,a,pn %icc, done1 yann@1: + ld [FP-64], %f0 yann@1: + yann@1: + cmp %o0, FFI_TYPE_DOUBLE yann@1: + be,a,pn %icc, done1 yann@1: + ldd [FP-64], %f0 yann@1: + yann@1: + cmp %o0, FFI_TYPE_LONGDOUBLE yann@1: + be,a,pn %icc, longdouble1 yann@1: + ldd [FP-64], %f0 yann@1: + yann@1: + cmp %o0, FFI_TYPE_STRUCT yann@1: + be,pn %icc, struct1 yann@1: + yann@1: + ! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER yann@1: + ldx [FP-64], %i0 yann@1: + yann@1: +done1: yann@1: + ret yann@1: + restore yann@1: + yann@1: +struct1: yann@1: + ldx [FP-56], %i2 yann@1: + ret yann@1: + restore yann@1: + yann@1: +longdouble1: yann@1: + ldd [FP-56], %f2 yann@1: + ret yann@1: + restore yann@1: +.LLFE2: yann@1: + yann@1: +.ffi_closure_v9_end: yann@1: + .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 yann@1: + yann@1: .section ".eh_frame",#alloc,#write yann@1: .LLframe1: yann@1: .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry yann@1: @@ -169,5 +251,27 @@ yann@1: .byte 0x1f ! uleb128 0x1f yann@1: .align 8 yann@1: .LLEFDE1: yann@1: - yann@1: +.LLSFDE2: yann@1: + .uaword .LLEFDE2-.LLASFDE2 ! FDE Length yann@1: +.LLASFDE2: yann@1: + .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset yann@1: +#ifdef HAVE_AS_SPARC_UA_PCREL yann@1: + .uaword %r_disp32(.LLFB2) yann@1: + .uaword .LLFE2-.LLFB2 ! FDE address range yann@1: +#else yann@1: + .align 8 yann@1: + .xword .LLFB2 yann@1: + .uaxword .LLFE2-.LLFB2 ! FDE address range yann@1: +#endif yann@1: + .byte 0x0 ! uleb128 0x0; Augmentation size yann@1: + .byte 0x4 ! DW_CFA_advance_loc4 yann@1: + .uaword .LLCFI1-.LLFB2 yann@1: + .byte 0xd ! DW_CFA_def_cfa_register yann@1: + .byte 0x1e ! uleb128 0x1e yann@1: + .byte 0x2d ! DW_CFA_GNU_window_save yann@1: + .byte 0x9 ! DW_CFA_register yann@1: + .byte 0xf ! uleb128 0xf yann@1: + .byte 0x1f ! uleb128 0x1f yann@1: + .align 8 yann@1: +.LLEFDE2: yann@1: #endif yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c yann@1: --- gcc-3.2.2.orig/libffi/src/types.c Tue Mar 27 11:39:16 2001 yann@1: +++ gcc/libffi/src/types.c Wed Nov 27 07:24:05 2002 yann@1: @@ -42,7 +42,8 @@ yann@1: FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); yann@1: FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); yann@1: yann@1: -#if defined ALPHA || defined SPARC64 yann@1: +#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \ yann@1: + || defined IA64 yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); yann@1: yann@1: @@ -52,22 +53,12 @@ yann@1: yann@1: #endif yann@1: yann@1: -#ifdef X86 yann@1: +#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); yann@1: FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); yann@1: yann@1: -#elif defined X86_WIN32 yann@1: - yann@1: -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); yann@1: -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); yann@1: - yann@1: -#elif defined ARM yann@1: - yann@1: -FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); yann@1: -FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); yann@1: - yann@1: -#elif defined M68K yann@1: +#elif defined SH yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); yann@1: FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); yann@1: @@ -80,12 +71,7 @@ yann@1: #endif yann@1: yann@1: yann@1: -#ifdef X86 yann@1: - yann@1: -FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); yann@1: -FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); yann@1: - yann@1: -#elif defined X86_WIN32 yann@1: +#if defined X86 || defined X86_WIN32 || defined M68K yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); yann@1: FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); yann@1: @@ -95,25 +81,25 @@ yann@1: FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); yann@1: FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); yann@1: yann@1: -#elif defined M68K yann@1: +#elif defined SH yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); yann@1: -FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); yann@1: +FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); yann@1: yann@1: #elif defined SPARC yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); yann@1: - yann@1: #ifdef SPARC64 yann@1: - yann@1: FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); yann@1: - yann@1: #else yann@1: - yann@1: FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); yann@1: - yann@1: #endif yann@1: yann@1: +#elif defined X86_64 yann@1: + yann@1: +FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); yann@1: +FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); yann@1: + yann@1: #else yann@1: yann@1: FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c yann@1: --- gcc-3.2.2.orig/libffi/src/x86/ffi.c Tue May 28 18:22:08 2002 yann@1: +++ gcc/libffi/src/x86/ffi.c Fri Dec 6 10:16:45 2002 yann@1: @@ -1,5 +1,8 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - ffi.c - Copyright (c) 1996, 1998, 1999 Cygnus Solutions yann@1: + ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. yann@1: + Copyright (c) 2002 Ranjit Mathew yann@1: + Copyright (c) 2002 Bo Thorsen yann@1: + Copyright (c) 2002 Roger Sayle yann@1: yann@1: x86 Foreign Function Interface yann@1: yann@1: @@ -23,6 +26,8 @@ yann@1: OTHER DEALINGS IN THE SOFTWARE. yann@1: ----------------------------------------------------------------------- */ yann@1: yann@1: +#ifndef __x86_64__ yann@1: + yann@1: #include yann@1: #include yann@1: yann@1: @@ -36,12 +41,10 @@ yann@1: /*@=exportheader@*/ yann@1: { yann@1: register unsigned int i; yann@1: - register int tmp; yann@1: register void **p_argv; yann@1: register char *argp; yann@1: register ffi_type **p_arg; yann@1: yann@1: - tmp = 0; yann@1: argp = stack; yann@1: yann@1: if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) yann@1: @@ -148,6 +151,18 @@ yann@1: /*@=declundef@*/ yann@1: /*@=exportheader@*/ yann@1: yann@1: +#ifdef X86_WIN32 yann@1: +/*@-declundef@*/ yann@1: +/*@-exportheader@*/ yann@1: +extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), yann@1: + /*@out@*/ extended_cif *, yann@1: + unsigned, unsigned, yann@1: + /*@out@*/ unsigned *, yann@1: + void (*fn)()); yann@1: +/*@=declundef@*/ yann@1: +/*@=exportheader@*/ yann@1: +#endif /* X86_WIN32 */ yann@1: + yann@1: void ffi_call(/*@dependent@*/ ffi_cif *cif, yann@1: void (*fn)(), yann@1: /*@out@*/ void *rvalue, yann@1: @@ -180,6 +195,14 @@ yann@1: cif->flags, ecif.rvalue, fn); yann@1: /*@=usedef@*/ yann@1: break; yann@1: +#ifdef X86_WIN32 yann@1: + case FFI_STDCALL: yann@1: + /*@-usedef@*/ yann@1: + ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, yann@1: + cif->flags, ecif.rvalue, fn); yann@1: + /*@=usedef@*/ yann@1: + break; yann@1: +#endif /* X86_WIN32 */ yann@1: default: yann@1: FFI_ASSERT(0); yann@1: break; yann@1: @@ -266,12 +289,10 @@ yann@1: /*@=exportheader@*/ yann@1: { yann@1: register unsigned int i; yann@1: - register int tmp; yann@1: register void **p_argv; yann@1: register char *argp; yann@1: register ffi_type **p_arg; yann@1: yann@1: - tmp = 0; yann@1: argp = stack; yann@1: yann@1: if ( cif->rtype->type == FFI_TYPE_STRUCT ) { yann@1: @@ -281,13 +302,14 @@ yann@1: yann@1: p_argv = avalue; yann@1: yann@1: - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) yann@1: + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) yann@1: { yann@1: size_t z; yann@1: yann@1: /* Align if necessary */ yann@1: - if (((*p_arg)->alignment - 1) & (unsigned) argp) yann@1: + if (((*p_arg)->alignment - 1) & (unsigned) argp) { yann@1: argp = (char *) ALIGN(argp, (*p_arg)->alignment); yann@1: + } yann@1: yann@1: z = (*p_arg)->size; yann@1: yann@1: @@ -298,7 +320,7 @@ yann@1: p_argv++; yann@1: argp += z; yann@1: } yann@1: - yann@1: + yann@1: return; yann@1: } yann@1: yann@1: @@ -449,6 +471,15 @@ yann@1: /*@out@*/ unsigned *, yann@1: void (*fn)()); yann@1: yann@1: +#ifdef X86_WIN32 yann@1: +extern void yann@1: +ffi_call_STDCALL(void (*)(char *, extended_cif *), yann@1: + /*@out@*/ extended_cif *, yann@1: + unsigned, unsigned, yann@1: + /*@out@*/ unsigned *, yann@1: + void (*fn)()); yann@1: +#endif /* X86_WIN32 */ yann@1: + yann@1: void yann@1: ffi_raw_call(/*@dependent@*/ ffi_cif *cif, yann@1: void (*fn)(), yann@1: @@ -483,6 +514,14 @@ yann@1: cif->flags, ecif.rvalue, fn); yann@1: /*@=usedef@*/ yann@1: break; yann@1: +#ifdef X86_WIN32 yann@1: + case FFI_STDCALL: yann@1: + /*@-usedef@*/ yann@1: + ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, yann@1: + cif->flags, ecif.rvalue, fn); yann@1: + /*@=usedef@*/ yann@1: + break; yann@1: +#endif /* X86_WIN32 */ yann@1: default: yann@1: FFI_ASSERT(0); yann@1: break; yann@1: @@ -490,3 +529,5 @@ yann@1: } yann@1: yann@1: #endif yann@1: + yann@1: +#endif /* __x86_64__ */ yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c yann@1: --- gcc-3.2.2.orig/libffi/src/x86/ffi64.c Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/x86/ffi64.c Wed Jan 29 00:54:28 2003 yann@1: @@ -0,0 +1,706 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + ffi.c - Copyright (c) 2002 Bo Thorsen yann@1: + yann@1: + x86-64 Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: + yann@1: +#include yann@1: +#include yann@1: + yann@1: +#include yann@1: +#include yann@1: + yann@1: +/* ffi_prep_args is called by the assembly routine once stack space yann@1: + has been allocated for the function's arguments */ yann@1: + yann@1: +#ifdef __x86_64__ yann@1: + yann@1: +#define MAX_GPR_REGS 6 yann@1: +#define MAX_SSE_REGS 8 yann@1: +typedef struct yann@1: +{ yann@1: + /* Registers for argument passing. */ yann@1: + long gpr[MAX_GPR_REGS]; yann@1: + __int128_t sse[MAX_SSE_REGS]; yann@1: + yann@1: + /* Stack space for arguments. */ yann@1: + char argspace[0]; yann@1: +} stackLayout; yann@1: + yann@1: +/* All reference to register classes here is identical to the code in yann@1: + gcc/config/i386/i386.c. Do *not* change one without the other. */ yann@1: + yann@1: +/* Register class used for passing given 64bit part of the argument. yann@1: + These represent classes as documented by the PS ABI, with the exception yann@1: + of SSESF, SSEDF classes, that are basically SSE class, just gcc will yann@1: + use SF or DFmode move instead of DImode to avoid reformating penalties. yann@1: + yann@1: + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves yann@1: + whenever possible (upper half does contain padding). yann@1: + */ yann@1: +enum x86_64_reg_class yann@1: + { yann@1: + X86_64_NO_CLASS, yann@1: + X86_64_INTEGER_CLASS, yann@1: + X86_64_INTEGERSI_CLASS, yann@1: + X86_64_SSE_CLASS, yann@1: + X86_64_SSESF_CLASS, yann@1: + X86_64_SSEDF_CLASS, yann@1: + X86_64_SSEUP_CLASS, yann@1: + X86_64_X87_CLASS, yann@1: + X86_64_X87UP_CLASS, yann@1: + X86_64_MEMORY_CLASS yann@1: + }; yann@1: + yann@1: +#define MAX_CLASSES 4 yann@1: + yann@1: +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal yann@1: + of this code is to classify each 8bytes of incoming argument by the register yann@1: + class and assign registers accordingly. */ yann@1: + yann@1: +/* Return the union class of CLASS1 and CLASS2. yann@1: + See the x86-64 PS ABI for details. */ yann@1: + yann@1: +static enum x86_64_reg_class yann@1: +merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) yann@1: +{ yann@1: + /* Rule #1: If both classes are equal, this is the resulting class. */ yann@1: + if (class1 == class2) yann@1: + return class1; yann@1: + yann@1: + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is yann@1: + the other class. */ yann@1: + if (class1 == X86_64_NO_CLASS) yann@1: + return class2; yann@1: + if (class2 == X86_64_NO_CLASS) yann@1: + return class1; yann@1: + yann@1: + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ yann@1: + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) yann@1: + return X86_64_MEMORY_CLASS; yann@1: + yann@1: + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ yann@1: + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) yann@1: + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) yann@1: + return X86_64_INTEGERSI_CLASS; yann@1: + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS yann@1: + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) yann@1: + return X86_64_INTEGER_CLASS; yann@1: + yann@1: + /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used. */ yann@1: + if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS yann@1: + || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS) yann@1: + return X86_64_MEMORY_CLASS; yann@1: + yann@1: + /* Rule #6: Otherwise class SSE is used. */ yann@1: + return X86_64_SSE_CLASS; yann@1: +} yann@1: + yann@1: +/* Classify the argument of type TYPE and mode MODE. yann@1: + CLASSES will be filled by the register class used to pass each word yann@1: + of the operand. The number of words is returned. In case the parameter yann@1: + should be passed in memory, 0 is returned. As a special case for zero yann@1: + sized containers, classes[0] will be NO_CLASS and 1 is returned. yann@1: + yann@1: + See the x86-64 PS ABI for details. yann@1: +*/ yann@1: +static int yann@1: +classify_argument (ffi_type *type, enum x86_64_reg_class classes[], yann@1: + int *byte_offset) yann@1: +{ yann@1: + /* First, align to the right place. */ yann@1: + *byte_offset = ALIGN(*byte_offset, type->alignment); yann@1: + yann@1: + switch (type->type) yann@1: + { yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_SINT64: yann@1: + case FFI_TYPE_POINTER: yann@1: + if (((*byte_offset) % 8 + type->size) <= 4) yann@1: + classes[0] = X86_64_INTEGERSI_CLASS; yann@1: + else yann@1: + classes[0] = X86_64_INTEGER_CLASS; yann@1: + return 1; yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (((*byte_offset) % 8) == 0) yann@1: + classes[0] = X86_64_SSESF_CLASS; yann@1: + else yann@1: + classes[0] = X86_64_SSE_CLASS; yann@1: + return 1; yann@1: + case FFI_TYPE_DOUBLE: yann@1: + classes[0] = X86_64_SSEDF_CLASS; yann@1: + return 1; yann@1: + case FFI_TYPE_LONGDOUBLE: yann@1: + classes[0] = X86_64_X87_CLASS; yann@1: + classes[1] = X86_64_X87UP_CLASS; yann@1: + return 2; yann@1: + case FFI_TYPE_STRUCT: yann@1: + { yann@1: + const int UNITS_PER_WORD = 8; yann@1: + int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; yann@1: + ffi_type **ptr; yann@1: + int i; yann@1: + enum x86_64_reg_class subclasses[MAX_CLASSES]; yann@1: + yann@1: + /* If the struct is larger than 16 bytes, pass it on the stack. */ yann@1: + if (type->size > 16) yann@1: + return 0; yann@1: + yann@1: + for (i = 0; i < words; i++) yann@1: + classes[i] = X86_64_NO_CLASS; yann@1: + yann@1: + /* Merge the fields of structure. */ yann@1: + for (ptr=type->elements; (*ptr)!=NULL; ptr++) yann@1: + { yann@1: + int num; yann@1: + yann@1: + num = classify_argument (*ptr, subclasses, byte_offset); yann@1: + if (num == 0) yann@1: + return 0; yann@1: + for (i = 0; i < num; i++) yann@1: + { yann@1: + int pos = *byte_offset / 8; yann@1: + classes[i + pos] = yann@1: + merge_classes (subclasses[i], classes[i + pos]); yann@1: + } yann@1: + yann@1: + if ((*ptr)->type != FFI_TYPE_STRUCT) yann@1: + *byte_offset += (*ptr)->size; yann@1: + } yann@1: + yann@1: + /* Final merger cleanup. */ yann@1: + for (i = 0; i < words; i++) yann@1: + { yann@1: + /* If one class is MEMORY, everything should be passed in yann@1: + memory. */ yann@1: + if (classes[i] == X86_64_MEMORY_CLASS) yann@1: + return 0; yann@1: + yann@1: + /* The X86_64_SSEUP_CLASS should be always preceded by yann@1: + X86_64_SSE_CLASS. */ yann@1: + if (classes[i] == X86_64_SSEUP_CLASS yann@1: + && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS)) yann@1: + classes[i] = X86_64_SSE_CLASS; yann@1: + yann@1: + /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ yann@1: + if (classes[i] == X86_64_X87UP_CLASS yann@1: + && (i == 0 || classes[i - 1] != X86_64_X87_CLASS)) yann@1: + classes[i] = X86_64_SSE_CLASS; yann@1: + } yann@1: + return words; yann@1: + } yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + return 0; /* Never reached. */ yann@1: +} yann@1: + yann@1: +/* Examine the argument and return set number of register required in each yann@1: + class. Return 0 iff parameter should be passed in memory. */ yann@1: +static int yann@1: +examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs) yann@1: +{ yann@1: + enum x86_64_reg_class class[MAX_CLASSES]; yann@1: + int offset = 0; yann@1: + int n; yann@1: + yann@1: + n = classify_argument (type, class, &offset); yann@1: + yann@1: + if (n == 0) yann@1: + return 0; yann@1: + yann@1: + *int_nregs = 0; yann@1: + *sse_nregs = 0; yann@1: + for (n--; n>=0; n--) yann@1: + switch (class[n]) yann@1: + { yann@1: + case X86_64_INTEGER_CLASS: yann@1: + case X86_64_INTEGERSI_CLASS: yann@1: + (*int_nregs)++; yann@1: + break; yann@1: + case X86_64_SSE_CLASS: yann@1: + case X86_64_SSESF_CLASS: yann@1: + case X86_64_SSEDF_CLASS: yann@1: + (*sse_nregs)++; yann@1: + break; yann@1: + case X86_64_NO_CLASS: yann@1: + case X86_64_SSEUP_CLASS: yann@1: + break; yann@1: + case X86_64_X87_CLASS: yann@1: + case X86_64_X87UP_CLASS: yann@1: + if (!in_return) yann@1: + return 0; yann@1: + break; yann@1: + default: yann@1: + abort (); yann@1: + } yann@1: + return 1; yann@1: +} yann@1: + yann@1: +/* Functions to load floats and double to an SSE register placeholder. */ yann@1: +extern void float2sse (float, __int128_t *); yann@1: +extern void double2sse (double, __int128_t *); yann@1: +extern void floatfloat2sse (void *, __int128_t *); yann@1: + yann@1: +/* Functions to put the floats and doubles back. */ yann@1: +extern float sse2float (__int128_t *); yann@1: +extern double sse2double (__int128_t *); yann@1: +extern void sse2floatfloat(__int128_t *, void *); yann@1: + yann@1: +/*@-exportheader@*/ yann@1: +void yann@1: +ffi_prep_args (stackLayout *stack, extended_cif *ecif) yann@1: +/*@=exportheader@*/ yann@1: +{ yann@1: + int gprcount, ssecount, i, g, s; yann@1: + void **p_argv; yann@1: + void *argp = &stack->argspace; yann@1: + ffi_type **p_arg; yann@1: + yann@1: + /* First check if the return value should be passed in memory. If so, yann@1: + pass the pointer as the first argument. */ yann@1: + gprcount = ssecount = 0; yann@1: + if (ecif->cif->rtype->type != FFI_TYPE_VOID yann@1: + && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0) yann@1: + (void *)stack->gpr[gprcount++] = ecif->rvalue; yann@1: + yann@1: + for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue; yann@1: + i!=0; i--, p_arg++, p_argv++) yann@1: + { yann@1: + int in_register = 0; yann@1: + yann@1: + switch ((*p_arg)->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_SINT64: yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_POINTER: yann@1: + if (gprcount < MAX_GPR_REGS) yann@1: + { yann@1: + stack->gpr[gprcount] = 0; yann@1: + stack->gpr[gprcount++] = *(long long *)(*p_argv); yann@1: + in_register = 1; yann@1: + } yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: + if (ssecount < MAX_SSE_REGS) yann@1: + { yann@1: + float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]); yann@1: + in_register = 1; yann@1: + } yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + if (ssecount < MAX_SSE_REGS) yann@1: + { yann@1: + double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]); yann@1: + in_register = 1; yann@1: + } yann@1: + break; yann@1: + } yann@1: + yann@1: + if (in_register) yann@1: + continue; yann@1: + yann@1: + /* Either all places in registers where filled, or this is a yann@1: + type that potentially goes into a memory slot. */ yann@1: + if (examine_argument (*p_arg, 0, &g, &s) == 0 yann@1: + || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS) yann@1: + { yann@1: + /* Pass this argument in memory. */ yann@1: + argp = (void *)ALIGN(argp, (*p_arg)->alignment); yann@1: + memcpy (argp, *p_argv, (*p_arg)->size); yann@1: + argp += (*p_arg)->size; yann@1: + } yann@1: + else yann@1: + { yann@1: + /* All easy cases are eliminated. Now fire the big guns. */ yann@1: + yann@1: + enum x86_64_reg_class classes[MAX_CLASSES]; yann@1: + int offset = 0, j, num; yann@1: + void *a; yann@1: + yann@1: + num = classify_argument (*p_arg, classes, &offset); yann@1: + for (j=0, a=*p_argv; jgpr[gprcount++] = *(long long *)a; yann@1: + break; yann@1: + case X86_64_SSE_CLASS: yann@1: + floatfloat2sse (a, &stack->sse[ssecount++]); yann@1: + break; yann@1: + case X86_64_SSESF_CLASS: yann@1: + float2sse (*(float *)a, &stack->sse[ssecount++]); yann@1: + break; yann@1: + case X86_64_SSEDF_CLASS: yann@1: + double2sse (*(double *)a, &stack->sse[ssecount++]); yann@1: + break; yann@1: + default: yann@1: + abort(); yann@1: + } yann@1: + } yann@1: + } yann@1: + } yann@1: +} yann@1: + yann@1: +/* Perform machine dependent cif processing. */ yann@1: +ffi_status yann@1: +ffi_prep_cif_machdep (ffi_cif *cif) yann@1: +{ yann@1: + int gprcount, ssecount, i, g, s; yann@1: + yann@1: + gprcount = ssecount = 0; yann@1: + yann@1: + /* Reset the byte count. We handle this size estimation here. */ yann@1: + cif->bytes = 0; yann@1: + yann@1: + /* If the return value should be passed in memory, pass the pointer yann@1: + as the first argument. The actual memory isn't allocated here. */ yann@1: + if (cif->rtype->type != FFI_TYPE_VOID yann@1: + && examine_argument (cif->rtype, 1, &g, &s) == 0) yann@1: + gprcount = 1; yann@1: + yann@1: + /* Go over all arguments and determine the way they should be passed. yann@1: + If it's in a register and there is space for it, let that be so. If yann@1: + not, add it's size to the stack byte count. */ yann@1: + for (i=0; inargs; i++) yann@1: + { yann@1: + if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0 yann@1: + || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS) yann@1: + { yann@1: + /* This is passed in memory. First align to the basic type. */ yann@1: + cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment); yann@1: + yann@1: + /* Stack arguments are *always* at least 8 byte aligned. */ yann@1: + cif->bytes = ALIGN(cif->bytes, 8); yann@1: + yann@1: + /* Now add the size of this argument. */ yann@1: + cif->bytes += cif->arg_types[i]->size; yann@1: + } yann@1: + else yann@1: + { yann@1: + gprcount += g; yann@1: + ssecount += s; yann@1: + } yann@1: + } yann@1: + yann@1: + /* Set the flag for the closures return. */ yann@1: + switch (cif->rtype->type) yann@1: + { yann@1: + case FFI_TYPE_VOID: yann@1: + case FFI_TYPE_STRUCT: yann@1: + case FFI_TYPE_SINT64: yann@1: + case FFI_TYPE_FLOAT: yann@1: + case FFI_TYPE_DOUBLE: yann@1: + case FFI_TYPE_LONGDOUBLE: yann@1: + cif->flags = (unsigned) cif->rtype->type; yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_UINT64: yann@1: + cif->flags = FFI_TYPE_SINT64; yann@1: + break; yann@1: + yann@1: + default: yann@1: + cif->flags = FFI_TYPE_INT; yann@1: + break; yann@1: + } yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +typedef struct yann@1: +{ yann@1: + long gpr[2]; yann@1: + __int128_t sse[2]; yann@1: + long double st0; yann@1: +} return_value; yann@1: + yann@1: +void yann@1: +ffi_fill_return_value (return_value *rv, extended_cif *ecif) yann@1: +{ yann@1: + enum x86_64_reg_class classes[MAX_CLASSES]; yann@1: + int i = 0, num; yann@1: + long *gpr = rv->gpr; yann@1: + __int128_t *sse = rv->sse; yann@1: + signed char sc; yann@1: + signed short ss; yann@1: + yann@1: + /* This is needed because of the way x86-64 handles signed short yann@1: + integers. */ yann@1: + switch (ecif->cif->rtype->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + sc = *(signed char *)gpr; yann@1: + *(long long *)ecif->rvalue = (long long)sc; yann@1: + return; yann@1: + case FFI_TYPE_SINT16: yann@1: + ss = *(signed short *)gpr; yann@1: + *(long long *)ecif->rvalue = (long long)ss; yann@1: + return; yann@1: + default: yann@1: + /* Just continue. */ yann@1: + ; yann@1: + } yann@1: + yann@1: + num = classify_argument (ecif->cif->rtype, classes, &i); yann@1: + yann@1: + if (num == 0) yann@1: + /* Return in memory. */ yann@1: + ecif->rvalue = (void *) rv->gpr[0]; yann@1: + else if (num == 2 && classes[0] == X86_64_X87_CLASS && yann@1: + classes[1] == X86_64_X87UP_CLASS) yann@1: + /* This is a long double (this is easiest to handle this way instead yann@1: + of an eightbyte at a time as in the loop below. */ yann@1: + *((long double *)ecif->rvalue) = rv->st0; yann@1: + else yann@1: + { yann@1: + void *a; yann@1: + yann@1: + for (i=0, a=ecif->rvalue; irtype, 1, &dummy, &dummy) == 0)) yann@1: + { yann@1: + /*@-sysunrecog@*/ yann@1: + ecif.rvalue = alloca(cif->rtype->size); yann@1: + /*@=sysunrecog@*/ yann@1: + } yann@1: + else yann@1: + ecif.rvalue = rvalue; yann@1: + yann@1: + /* Stack must always be 16byte aligned. Make it so. */ yann@1: + cif->bytes = ALIGN(cif->bytes, 16); yann@1: + yann@1: + switch (cif->abi) yann@1: + { yann@1: + case FFI_SYSV: yann@1: + /* Calling 32bit code from 64bit is not possible */ yann@1: + FFI_ASSERT(0); yann@1: + break; yann@1: + yann@1: + case FFI_UNIX64: yann@1: + /*@-usedef@*/ yann@1: + ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif, yann@1: + cif->bytes, ecif.rvalue, fn); yann@1: + /*@=usedef@*/ yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + break; yann@1: + } yann@1: +} yann@1: + yann@1: +extern void ffi_closure_UNIX64(void); yann@1: + yann@1: +ffi_status yann@1: +ffi_prep_closure (ffi_closure* closure, yann@1: + ffi_cif* cif, yann@1: + void (*fun)(ffi_cif*, void*, void**, void*), yann@1: + void *user_data) yann@1: +{ yann@1: + volatile unsigned short *tramp; yann@1: + yann@1: + /* FFI_ASSERT (cif->abi == FFI_OSF); */ yann@1: + yann@1: + tramp = (volatile unsigned short *) &closure->tramp[0]; yann@1: + tramp[0] = 0xbb49; /* mov , %r11 */ yann@1: + tramp[5] = 0xba49; /* mov , %r10 */ yann@1: + tramp[10] = 0xff49; /* jmp *%r11 */ yann@1: + tramp[11] = 0x00e3; yann@1: + *(void * volatile *) &tramp[1] = ffi_closure_UNIX64; yann@1: + *(void * volatile *) &tramp[6] = closure; yann@1: + yann@1: + closure->cif = cif; yann@1: + closure->fun = fun; yann@1: + closure->user_data = user_data; yann@1: + yann@1: + return FFI_OK; yann@1: +} yann@1: + yann@1: +int yann@1: +ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp) yann@1: +{ yann@1: + ffi_cif *cif; yann@1: + void **avalue; yann@1: + ffi_type **arg_types; yann@1: + long i, avn, argn; yann@1: + yann@1: + cif = closure->cif; yann@1: + avalue = alloca(cif->nargs * sizeof(void *)); yann@1: + yann@1: + argn = 0; yann@1: + yann@1: + i = 0; yann@1: + avn = cif->nargs; yann@1: + arg_types = cif->arg_types; yann@1: + yann@1: + /* Grab the addresses of the arguments from the stack frame. */ yann@1: + while (i < avn) yann@1: + { yann@1: + switch (arg_types[i]->type) yann@1: + { yann@1: + case FFI_TYPE_SINT8: yann@1: + case FFI_TYPE_UINT8: yann@1: + case FFI_TYPE_SINT16: yann@1: + case FFI_TYPE_UINT16: yann@1: + case FFI_TYPE_SINT32: yann@1: + case FFI_TYPE_UINT32: yann@1: + case FFI_TYPE_SINT64: yann@1: + case FFI_TYPE_UINT64: yann@1: + case FFI_TYPE_POINTER: yann@1: + { yann@1: + if (l->gp_offset > 48-8) yann@1: + { yann@1: + avalue[i] = l->overflow_arg_area; yann@1: + l->overflow_arg_area = (char *)l->overflow_arg_area + 8; yann@1: + } yann@1: + else yann@1: + { yann@1: + avalue[i] = (char *)l->reg_save_area + l->gp_offset; yann@1: + l->gp_offset += 8; yann@1: + } yann@1: + } yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_STRUCT: yann@1: + /* FIXME */ yann@1: + FFI_ASSERT(0); yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_DOUBLE: yann@1: + { yann@1: + if (l->fp_offset > 176-16) yann@1: + { yann@1: + avalue[i] = l->overflow_arg_area; yann@1: + l->overflow_arg_area = (char *)l->overflow_arg_area + 8; yann@1: + } yann@1: + else yann@1: + { yann@1: + avalue[i] = (char *)l->reg_save_area + l->fp_offset; yann@1: + l->fp_offset += 16; yann@1: + } yann@1: + } yann@1: +#if DEBUG_FFI yann@1: + fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]); yann@1: +#endif yann@1: + break; yann@1: + yann@1: + case FFI_TYPE_FLOAT: yann@1: + { yann@1: + if (l->fp_offset > 176-16) yann@1: + { yann@1: + avalue[i] = l->overflow_arg_area; yann@1: + l->overflow_arg_area = (char *)l->overflow_arg_area + 8; yann@1: + } yann@1: + else yann@1: + { yann@1: + avalue[i] = (char *)l->reg_save_area + l->fp_offset; yann@1: + l->fp_offset += 16; yann@1: + } yann@1: + } yann@1: +#if DEBUG_FFI yann@1: + fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]); yann@1: +#endif yann@1: + break; yann@1: + yann@1: + default: yann@1: + FFI_ASSERT(0); yann@1: + } yann@1: + yann@1: + argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG; yann@1: + i++; yann@1: + } yann@1: + yann@1: + /* Invoke the closure. */ yann@1: + (closure->fun) (cif, rp, avalue, closure->user_data); yann@1: + yann@1: + /* FIXME: Structs not supported. */ yann@1: + FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT); yann@1: + yann@1: + /* Tell ffi_closure_UNIX64 how to perform return type promotions. */ yann@1: + yann@1: + return cif->rtype->type; yann@1: +} yann@1: +#endif /* ifndef __x86_64__ */ yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S yann@1: --- gcc-3.2.2.orig/libffi/src/x86/sysv.S Tue Jul 17 02:10:53 2001 yann@1: +++ gcc/libffi/src/x86/sysv.S Fri Jul 19 08:08:31 2002 yann@1: @@ -1,5 +1,5 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - sysv.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions yann@1: + sysv.S - Copyright (c) 1996, 1998, 2001, 2002 Cygnus Solutions yann@1: yann@1: X86 Foreign Function Interface yann@1: yann@1: @@ -23,6 +23,8 @@ yann@1: OTHER DEALINGS IN THE SOFTWARE. yann@1: ----------------------------------------------------------------------- */ yann@1: yann@1: +#ifndef __x86_64__ yann@1: + yann@1: #define LIBFFI_ASM yann@1: #include yann@1: yann@1: @@ -163,3 +165,5 @@ yann@1: .align 4 yann@1: .LEFDE1: yann@1: .set .LLFDE1,.LEFDE1-.LSFDE1 yann@1: + yann@1: +#endif /* ifndef __x86_64__ */ yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S yann@1: --- gcc-3.2.2.orig/libffi/src/x86/unix64.S Thu Jan 1 09:00:00 1970 yann@1: +++ gcc/libffi/src/x86/unix64.S Wed Jan 29 00:54:28 2003 yann@1: @@ -0,0 +1,302 @@ yann@1: +/* ----------------------------------------------------------------------- yann@1: + unix64.S - Copyright (c) 2002 Bo Thorsen yann@1: + yann@1: + x86-64 Foreign Function Interface yann@1: + yann@1: + Permission is hereby granted, free of charge, to any person obtaining yann@1: + a copy of this software and associated documentation files (the yann@1: + ``Software''), to deal in the Software without restriction, including yann@1: + without limitation the rights to use, copy, modify, merge, publish, yann@1: + distribute, sublicense, and/or sell copies of the Software, and to yann@1: + permit persons to whom the Software is furnished to do so, subject to yann@1: + the following conditions: yann@1: + yann@1: + The above copyright notice and this permission notice shall be included yann@1: + in all copies or substantial portions of the Software. yann@1: + yann@1: + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS yann@1: + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF yann@1: + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. yann@1: + IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR yann@1: + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, yann@1: + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR yann@1: + OTHER DEALINGS IN THE SOFTWARE. yann@1: + ----------------------------------------------------------------------- */ yann@1: + yann@1: +#ifdef __x86_64__ yann@1: +#define LIBFFI_ASM yann@1: +#include yann@1: + yann@1: + .section .rodata yann@1: +.LC0: yann@1: + .string "asm in progress %lld\n" yann@1: +.LC1: yann@1: + .string "asm in progress\n" yann@1: +.text yann@1: + .align 2 yann@1: +.globl ffi_call_UNIX64 yann@1: + .type ffi_call_UNIX64,@function yann@1: + yann@1: +ffi_call_UNIX64: yann@1: +.LFB1: yann@1: + pushq %rbp yann@1: +.LCFI0: yann@1: + movq %rsp, %rbp yann@1: +.LCFI1: yann@1: + /* Save all arguments */ yann@1: + subq $48, %rsp yann@1: +.LCFI2: yann@1: + movq %rdi, -8(%rbp) /* ffi_prep_args */ yann@1: + movq %rsi, -16(%rbp) /* ffi_fill_return_value */ yann@1: + movq %rdx, -24(%rbp) /* ecif */ yann@1: + movq %rcx, -32(%rbp) /* cif->bytes */ yann@1: + movq %r8, -40(%rbp) /* ecif.rvalue */ yann@1: + movq %r9, -48(%rbp) /* fn */ yann@1: + yann@1: + /* Make room for all of the new args and the register args */ yann@1: + addl $176, %ecx yann@1: +.LCFI3: yann@1: + subq %rcx, %rsp yann@1: +.LCFI4: yann@1: + /* Setup the call to ffi_prep_args. */ yann@1: + movq %rdi, %rax /* &ffi_prep_args */ yann@1: + movq %rsp, %rdi /* stackLayout */ yann@1: + movq %rdx, %rsi /* ecif */ yann@1: + call *%rax /* ffi_prep_args(stackLayout, ecif);*/ yann@1: + yann@1: + /* ffi_prep_args have put all the register contents into the */ yann@1: + /* stackLayout struct. Now put the register values in place. */ yann@1: + movq (%rsp), %rdi yann@1: + movq 8(%rsp), %rsi yann@1: + movq 16(%rsp), %rdx yann@1: + movq 24(%rsp), %rcx yann@1: + movq 32(%rsp), %r8 yann@1: + movq 40(%rsp), %r9 yann@1: + movaps 48(%rsp), %xmm0 yann@1: + movaps 64(%rsp), %xmm1 yann@1: + movaps 80(%rsp), %xmm2 yann@1: + movaps 96(%rsp), %xmm3 yann@1: + movaps 112(%rsp), %xmm4 yann@1: + movaps 128(%rsp), %xmm5 yann@1: + movaps 144(%rsp), %xmm6 yann@1: + movaps 160(%rsp), %xmm7 yann@1: + yann@1: + /* Remove space for stackLayout so stack arguments are placed yann@1: + correctly for the call. */ yann@1: +.LCFI5: yann@1: + addq $176, %rsp yann@1: +.LCFI6: yann@1: + /* Call the user function. */ yann@1: + call *-48(%rbp) yann@1: + yann@1: + /* Make stack space for the return_value struct. */ yann@1: + subq $64, %rsp yann@1: + yann@1: + /* Fill in all potential return values to this struct. */ yann@1: + movq %rax, (%rsp) yann@1: + movq %rdx, 8(%rsp) yann@1: + movaps %xmm0, 16(%rsp) yann@1: + movaps %xmm1, 32(%rsp) yann@1: + fstpt 48(%rsp) yann@1: + yann@1: + /* Now call ffi_fill_return_value. */ yann@1: + movq %rsp, %rdi /* struct return_value */ yann@1: + movq -24(%rbp), %rsi /* ecif */ yann@1: + movq -16(%rbp), %rax /* &ffi_fill_return_value */ yann@1: + call *%rax /* call it */ yann@1: + yann@1: + /* And the work is done. */ yann@1: + leave yann@1: + ret yann@1: +.LFE1: yann@1: +.ffi_call_UNIX64_end: yann@1: + .size ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64 yann@1: + yann@1: +.text yann@1: + .align 2 yann@1: +.globl float2sse yann@1: + .type float2sse,@function yann@1: +float2sse: yann@1: + /* Save the contents of this sse-float in a pointer. */ yann@1: + movaps %xmm0, (%rdi) yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl floatfloat2sse yann@1: + .type floatfloat2sse,@function yann@1: +floatfloat2sse: yann@1: + /* Save the contents of these two sse-floats in a pointer. */ yann@1: + movq (%rdi), %xmm0 yann@1: + movaps %xmm0, (%rsi) yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl double2sse yann@1: + .type double2sse,@function yann@1: +double2sse: yann@1: + /* Save the contents of this sse-double in a pointer. */ yann@1: + movaps %xmm0, (%rdi) yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl sse2float yann@1: + .type sse2float,@function yann@1: +sse2float: yann@1: + /* Save the contents of this sse-float in a pointer. */ yann@1: + movaps (%rdi), %xmm0 yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl sse2double yann@1: + .type sse2double,@function yann@1: +sse2double: yann@1: + /* Save the contents of this pointer in a sse-double. */ yann@1: + movaps (%rdi), %xmm0 yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl sse2floatfloat yann@1: + .type sse2floatfloat,@function yann@1: +sse2floatfloat: yann@1: + /* Save the contents of this pointer in two sse-floats. */ yann@1: + movaps (%rdi), %xmm0 yann@1: + movq %xmm0, (%rsi) yann@1: + ret yann@1: + yann@1: + .align 2 yann@1: +.globl ffi_closure_UNIX64 yann@1: + .type ffi_closure_UNIX64,@function yann@1: + yann@1: +ffi_closure_UNIX64: yann@1: +.LFB2: yann@1: + pushq %rbp yann@1: +.LCFI10: yann@1: + movq %rsp, %rbp yann@1: +.LCFI11: yann@1: + subq $240, %rsp yann@1: +.LCFI12: yann@1: + movq %rdi, -176(%rbp) yann@1: + movq %rsi, -168(%rbp) yann@1: + movq %rdx, -160(%rbp) yann@1: + movq %rcx, -152(%rbp) yann@1: + movq %r8, -144(%rbp) yann@1: + movq %r9, -136(%rbp) yann@1: + /* FIXME: We can avoid all this stashing of XMM registers by yann@1: + (in ffi_prep_closure) computing the number of yann@1: + floating-point args and moving it into %rax before calling yann@1: + this function. Once this is done, uncomment the next few yann@1: + lines and only the essential XMM registers will be written yann@1: + to memory. This is a significant saving. */ yann@1: +/* movzbl %al, %eax */ yann@1: +/* movq %rax, %rdx */ yann@1: +/* leaq 0(,%rdx,4), %rax */ yann@1: +/* leaq 2f(%rip), %rdx */ yann@1: +/* subq %rax, %rdx */ yann@1: + leaq -1(%rbp), %rax yann@1: +/* jmp *%rdx */ yann@1: + movaps %xmm7, -15(%rax) yann@1: + movaps %xmm6, -31(%rax) yann@1: + movaps %xmm5, -47(%rax) yann@1: + movaps %xmm4, -63(%rax) yann@1: + movaps %xmm3, -79(%rax) yann@1: + movaps %xmm2, -95(%rax) yann@1: + movaps %xmm1, -111(%rax) yann@1: + movaps %xmm0, -127(%rax) yann@1: +2: yann@1: + movl %edi, -180(%rbp) yann@1: + movl $0, -224(%rbp) yann@1: + movl $48, -220(%rbp) yann@1: + leaq 16(%rbp), %rax yann@1: + movq %rax, -216(%rbp) yann@1: + leaq -176(%rbp), %rdx yann@1: + movq %rdx, -208(%rbp) yann@1: + leaq -224(%rbp), %rsi yann@1: + movq %r10, %rdi yann@1: + movq %rsp, %rdx yann@1: + call ffi_closure_UNIX64_inner@PLT yann@1: + yann@1: + cmpl $FFI_TYPE_FLOAT, %eax yann@1: + je 1f yann@1: + cmpl $FFI_TYPE_DOUBLE, %eax yann@1: + je 2f yann@1: + cmpl $FFI_TYPE_LONGDOUBLE, %eax yann@1: + je 3f yann@1: + cmpl $FFI_TYPE_STRUCT, %eax yann@1: + je 4f yann@1: + popq %rax yann@1: + leave yann@1: + ret yann@1: +1: yann@1: +2: yann@1: +3: yann@1: + movaps -240(%rbp), %xmm0 yann@1: + leave yann@1: + ret yann@1: +4: yann@1: + leave yann@1: + ret yann@1: +.LFE2: yann@1: + yann@1: + .section .eh_frame,"a",@progbits yann@1: +.Lframe0: yann@1: + .long .LECIE1-.LSCIE1 yann@1: +.LSCIE1: yann@1: + .long 0x0 yann@1: + .byte 0x1 yann@1: + .string "zR" yann@1: + .uleb128 0x1 yann@1: + .sleb128 -8 yann@1: + .byte 0x10 yann@1: + .uleb128 0x1 yann@1: + .byte 0x1b yann@1: + .byte 0xc yann@1: + .uleb128 0x7 yann@1: + .uleb128 0x8 yann@1: + .byte 0x90 yann@1: + .uleb128 0x1 yann@1: + .align 8 yann@1: +.LECIE1: yann@1: +.LSFDE1: yann@1: + .long .LEFDE1-.LASFDE1 yann@1: +.LASFDE1: yann@1: + .long .LASFDE1-.Lframe0 yann@1: + yann@1: + .long .LFB1-. yann@1: + .long .LFE1-.LFB1 yann@1: + .uleb128 0x0 yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .long .LCFI0-.LFB1 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0x10 yann@1: + .byte 0x86 # DW_CFA_offset: r6 at cfa-16 yann@1: + .uleb128 0x2 yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .long .LCFI1-.LCFI0 yann@1: + .byte 0x86 # DW_CFA_offset: r6 at cfa-16 yann@1: + .uleb128 0x2 yann@1: + .byte 0xd # DW_CFA_def_cfa_reg: r6 yann@1: + .uleb128 0x6 yann@1: + .align 8 yann@1: +.LEFDE1: yann@1: +.LSFDE3: yann@1: + .long .LEFDE3-.LASFDE3 # FDE Length yann@1: +.LASFDE3: yann@1: + .long .LASFDE3-.Lframe0 # FDE CIE offset yann@1: + yann@1: + .long .LFB2-. # FDE initial location yann@1: + .long .LFE2-.LFB2 # FDE address range yann@1: + .uleb128 0x0 # Augmentation size yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .long .LCFI10-.LFB2 yann@1: + .byte 0xe # DW_CFA_def_cfa_offset yann@1: + .uleb128 0x10 yann@1: + .byte 0x86 # DW_CFA_offset, column 0x6 yann@1: + .uleb128 0x2 yann@1: + .byte 0x4 # DW_CFA_advance_loc4 yann@1: + .long .LCFI11-.LCFI10 yann@1: + .byte 0xd # DW_CFA_def_cfa_register yann@1: + .uleb128 0x6 yann@1: + .align 8 yann@1: +.LEFDE3: yann@1: + yann@1: +#endif /* __x86_64__ */ yann@1: diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S yann@1: --- gcc-3.2.2.orig/libffi/src/x86/win32.S Tue Mar 27 11:39:16 2001 yann@1: +++ gcc/libffi/src/x86/win32.S Fri Dec 6 10:16:45 2002 yann@1: @@ -1,5 +1,8 @@ yann@1: /* ----------------------------------------------------------------------- yann@1: - win32.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions yann@1: + win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc. yann@1: + Copyright (c) 2001 John Beniton yann@1: + Copyright (c) 2002 Ranjit Mathew yann@1: + yann@1: yann@1: X86 Foreign Function Interface yann@1: yann@1: @@ -52,7 +55,10 @@ yann@1: # Return stack to previous state and call the function yann@1: addl $8,%esp yann@1: yann@1: - call *28(%ebp) yann@1: + # FIXME: Align the stack to a 128-bit boundary to avoid yann@1: + # potential performance hits. yann@1: + yann@1: + call *28(%ebp) yann@1: yann@1: # Remove the space we pushed for the args yann@1: movl 16(%ebp),%ecx yann@1: @@ -123,3 +129,98 @@ yann@1: ret yann@1: yann@1: .ffi_call_SYSV_end: yann@1: + yann@1: + # This assumes we are using gas. yann@1: + .balign 16 yann@1: +.globl _ffi_call_STDCALL yann@1: + yann@1: +_ffi_call_STDCALL: yann@1: + pushl %ebp yann@1: + movl %esp,%ebp yann@1: + yann@1: + # Make room for all of the new args. yann@1: + movl 16(%ebp),%ecx yann@1: + subl %ecx,%esp yann@1: + yann@1: + movl %esp,%eax yann@1: + yann@1: + # Place all of the ffi_prep_args in position yann@1: + pushl 12(%ebp) yann@1: + pushl %eax yann@1: + call *8(%ebp) yann@1: + yann@1: + # Return stack to previous state and call the function yann@1: + addl $8,%esp yann@1: + yann@1: + # FIXME: Align the stack to a 128-bit boundary to avoid yann@1: + # potential performance hits. yann@1: + yann@1: + call *28(%ebp) yann@1: + yann@1: + # stdcall functions pop arguments off the stack themselves yann@1: + yann@1: + # Load %ecx with the return type code yann@1: + movl 20(%ebp),%ecx yann@1: + yann@1: + # If the return value pointer is NULL, assume no return value. yann@1: + cmpl $0,24(%ebp) yann@1: + jne sc_retint yann@1: + yann@1: + # Even if there is no space for the return value, we are yann@1: + # obliged to handle floating-point values. yann@1: + cmpl $FFI_TYPE_FLOAT,%ecx yann@1: + jne sc_noretval yann@1: + fstp %st(0) yann@1: + yann@1: + jmp sc_epilogue yann@1: + yann@1: +sc_retint: yann@1: + cmpl $FFI_TYPE_INT,%ecx yann@1: + jne sc_retfloat yann@1: + # Load %ecx with the pointer to storage for the return value yann@1: + movl 24(%ebp),%ecx yann@1: + movl %eax,0(%ecx) yann@1: + jmp sc_epilogue yann@1: + yann@1: +sc_retfloat: yann@1: + cmpl $FFI_TYPE_FLOAT,%ecx yann@1: + jne sc_retdouble yann@1: + # Load %ecx with the pointer to storage for the return value yann@1: + movl 24(%ebp),%ecx yann@1: + fstps (%ecx) yann@1: + jmp sc_epilogue yann@1: + yann@1: +sc_retdouble: yann@1: + cmpl $FFI_TYPE_DOUBLE,%ecx yann@1: + jne sc_retlongdouble yann@1: + # Load %ecx with the pointer to storage for the return value yann@1: + movl 24(%ebp),%ecx yann@1: + fstpl (%ecx) yann@1: + jmp sc_epilogue yann@1: + yann@1: +sc_retlongdouble: yann@1: + cmpl $FFI_TYPE_LONGDOUBLE,%ecx yann@1: + jne sc_retint64 yann@1: + # Load %ecx with the pointer to storage for the return value yann@1: + movl 24(%ebp),%ecx yann@1: + fstpt (%ecx) yann@1: + jmp sc_epilogue yann@1: + yann@1: +sc_retint64: yann@1: + cmpl $FFI_TYPE_SINT64,%ecx yann@1: + jne sc_retstruct yann@1: + # Load %ecx with the pointer to storage for the return value yann@1: + movl 24(%ebp),%ecx yann@1: + movl %eax,0(%ecx) yann@1: + movl %edx,4(%ecx) yann@1: + yann@1: +sc_retstruct: yann@1: + # Nothing to do! yann@1: + yann@1: +sc_noretval: yann@1: +sc_epilogue: yann@1: + movl %ebp,%esp yann@1: + popl %ebp yann@1: + ret yann@1: + yann@1: +.ffi_call_STDCALL_end: yann@1: --- gcc-3.2.2.orig/libjava/configure.host Mon Jun 10 13:15:26 2002 yann@1: +++ gcc-3.2.2/libjava/configure.host Sat Feb 15 19:57:25 2003 yann@1: @@ -115,6 +115,12 @@ yann@1: enable_getenv_properties_default=no yann@1: enable_main_args_default=no yann@1: ;; yann@1: + sh-* | sh[34]*-*) yann@1: + sysdeps_dir=sh yann@1: + libgcj_flags="${libgcj_flags} -mieee" yann@1: + libgcj_interpreter=yes yann@1: + enable_hash_synchronization_default=yes yann@1: + ;; yann@1: esac yann@1: yann@1: # This case statement supports generic port properties and may refine yann@1: @@ -126,7 +132,8 @@ yann@1: powerpc*-linux* | \ yann@1: alpha*-linux* | \ yann@1: sparc*-linux* | \ yann@1: - ia64-*) yann@1: + ia64-* | \ yann@1: + sh-linux* | sh[34]*-linux*) yann@1: can_unwind_signal=yes yann@1: ;; yann@1: *-*-darwin*)