tags +patch thanks The appended patch fixes the problem -- in theory. A build on mipsel still fails because
- The alignment for small arguments is broken in gcc-3.3 (it does big-endian style). gcc-3.4 works. - The floating-point argument passing convention is slightly broken for o32 with all gcc-3.x. gcc 2 and gcc 4 are ok. This can be papered over by ignoring the testsuite results, as it was done before this patch. It will still work in most cases relevant for gnustep. If this is _not_ done, the mips build will fail as well due to the FP argument brokenness. It may also fail for other architectures which have some yet ignored testsuite problem, I haven't checked these. Thiemo diff -uprN ffcall-1.10.orig/debian/rules ffcall-1.10/debian/rules --- ffcall-1.10.orig/debian/rules 2005-03-23 19:25:27.000000000 +0000 +++ ffcall-1.10/debian/rules 2005-03-20 19:13:32.000000000 +0000 @@ -28,7 +28,7 @@ configure-stamp: --mandir=\$${prefix}/share/man \ --infodir=\$${prefix}/usr/share/info \ --enable-shared \ - $(DEB_HOST_GNU_TYPE) + --build=$(DEB_HOST_GNU_TYPE) touch configure-stamp build: configure-stamp build-stamp diff -uprN ffcall-1.10.orig/ffcall/Makefile.devel ffcall-1.10/ffcall/Makefile.devel --- ffcall-1.10.orig/ffcall/Makefile.devel 2004-01-26 16:16:04.000000000 +0000 +++ ffcall-1.10/ffcall/Makefile.devel 2005-03-21 02:40:22.000000000 +0000 @@ -9,30 +9,28 @@ all : autoconf/aclocal.m4 configures avc CONFIGURES = configure avcall/configure vacall/configure trampoline/configure callback/configure callback/vacall_r/configure callback/trampoline_r/configure CONFIGURES_IN = configure.in avcall/configure.in vacall/configure.in trampoline/configure.in callback/configure.in callback/vacall_r/configure.in callback/trampoline_r/configure.in -CLISP_DIR = .. - -m4/general.m4 : $(CLISP_DIR)/src/m4/general.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/proto.m4 : $(CLISP_DIR)/src/m4/proto.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/cc-gcc.m4 : $(CLISP_DIR)/src/m4/cc-gcc.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/as-underscore.m4 : $(CLISP_DIR)/src/m4/as-underscore.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ranlib.m4 : $(CLISP_DIR)/src/m4/ranlib.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/install.m4 : $(CLISP_DIR)/src/m4/install.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/cp.m4 : $(CLISP_DIR)/src/m4/cp.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ln.m4 : $(CLISP_DIR)/src/m4/ln.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ffcall-pccstruct.m4 : $(CLISP_DIR)/src/m4/ffcall-pccstruct.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ffcall-smallstruct.m4 : $(CLISP_DIR)/src/m4/ffcall-smallstruct.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ffcall-ireg.m4 : $(CLISP_DIR)/src/m4/ffcall-ireg.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/longlong.m4 : $(CLISP_DIR)/src/m4/longlong.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/cc-void.m4 : $(CLISP_DIR)/src/m4/cc-void.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/stdc-headers.m4 : $(CLISP_DIR)/src/m4/stdc-headers.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/getpagesize.m4 : $(CLISP_DIR)/src/m4/getpagesize.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/mach-vm.m4 : $(CLISP_DIR)/src/m4/mach-vm.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/openflags.m4 : $(CLISP_DIR)/src/m4/openflags.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/mmap.m4 : $(CLISP_DIR)/src/m4/mmap.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/mprotect.m4 : $(CLISP_DIR)/src/m4/mprotect.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/shm.m4 : $(CLISP_DIR)/src/m4/shm.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/ffcall-codeexec.m4 : $(CLISP_DIR)/src/m4/ffcall-codeexec.m4 ; cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ -m4/libtool.m4 : $(CLISP_DIR)/src/m4/libtool.m4 +m4/general.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/proto.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/cc-gcc.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/as-underscore.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ranlib.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/install.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/cp.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ln.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ffcall-pccstruct.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ffcall-smallstruct.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ffcall-ireg.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/longlong.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/cc-void.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/stdc-headers.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/getpagesize.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/mach-vm.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/openflags.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/mmap.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/mprotect.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/shm.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/ffcall-codeexec.m4 : cp -p $< [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ +m4/libtool.m4 : sed -e 's,AC_CANONICAL_HOST,CL_CANONICAL_HOST,g' -e 's,AC_PROG_RANLIB,CL_PROG_RANLIB,g' -e 's,AC_PROG_LN_S,CL_PROG_LN_S,g' < $< > [EMAIL PROTECTED] && mv [EMAIL PROTECTED] $@ autoconf/aclocal.m4 : m4/general.m4 m4/proto.m4 m4/cc-gcc.m4 m4/as-underscore.m4 m4/ranlib.m4 m4/install.m4 m4/cp.m4 m4/ln.m4 m4/ffcall-pccstruct.m4 m4/ffcall-smallstruct.m4 m4/ffcall-ireg.m4 m4/longlong.m4 m4/cc-void.m4 m4/stdc-headers.m4 m4/getpagesize.m4 m4/mach-vm.m4 m4/openflags.m4 m4/mmap.m4 m4/mprotect.m4 m4/shm.m4 m4/ffcall-codeexec.m4 m4/libtool.m4 diff -uprN ffcall-1.10.orig/ffcall/Makefile.in ffcall-1.10/ffcall/Makefile.in --- ffcall-1.10.orig/ffcall/Makefile.in 2001-02-20 19:19:32.000000000 +0000 +++ ffcall-1.10/ffcall/Makefile.in 2005-03-21 02:38:28.000000000 +0000 @@ -19,35 +19,35 @@ RM = rm -f SHELL = /bin/sh all : force - cd @subdir@; $(MAKE) all + cd @subdir@ && $(MAKE) all install : force - cd @subdir@; $(MAKE) install + cd @subdir@ && $(MAKE) install installdirs : force - cd @subdir@; $(MAKE) installdirs + cd @subdir@ && $(MAKE) installdirs uninstall : force - cd @subdir@; $(MAKE) uninstall + cd @subdir@ && $(MAKE) uninstall check : force - cd @subdir@; $(MAKE) check + cd @subdir@ && $(MAKE) check extracheck : force - cd @subdir@; $(MAKE) extracheck + cd @subdir@ && $(MAKE) extracheck mostlyclean : force - cd @subdir@; $(MAKE) mostlyclean + cd @subdir@ && $(MAKE) mostlyclean clean : force - cd @subdir@; $(MAKE) clean + cd @subdir@ && $(MAKE) clean distclean : force - cd @subdir@; if test -f Makefile; then $(MAKE) distclean; fi + cd @subdir@ && if test -f Makefile; then $(MAKE) distclean; fi $(RM) config.status config.log config.cache Makefile maintainer-clean : force - cd @subdir@; if test -f Makefile; then $(MAKE) maintainer-clean; fi + cd @subdir@ && if test -f Makefile; then $(MAKE) maintainer-clean; fi $(RM) config.status config.log config.cache Makefile force : diff -uprN ffcall-1.10.orig/ffcall/avcall/avcall-mips.S ffcall-1.10/ffcall/avcall/avcall-mips.S --- ffcall-1.10.orig/ffcall/avcall/avcall-mips.S 1999-11-24 22:39:34.000000000 +0000 +++ ffcall-1.10/ffcall/avcall/avcall-mips.S 2005-03-20 00:57:11.000000000 +0000 @@ -1,418 +1,406 @@ -#include "asmmips.h" .file 1 "avcall-mips.c" - .set nobopt + .section .mdebug.abi32 + .previous + .abicalls .text .align 2 .globl __builtin_avcall - DECLARE_FUNCTION(__builtin_avcall) - - .text - .text .ent __builtin_avcall + .type __builtin_avcall, @function __builtin_avcall: - .frame $fp,32,$31 - .mask 0xc0010000,-8 + .frame $fp,96,$31 # vars= 56, regs= 3/0, args= 16, extra= 8 + .mask 0xd0000000,-8 .fmask 0x00000000,0 - subu $sp,$sp,32 - sw $fp,20($sp) + .set noreorder + .cpload $25 + .set reorder + subu $sp,$sp,96 + .cprestore 16 + sw $31,88($sp) + sw $fp,84($sp) + sw $28,80($sp) move $fp,$sp - sw $31,24($sp) - sw $16,16($sp) + sw $4,96($fp) addu $sp,$sp,-1024 - move $16,$4 - move $4,$sp - lw $3,20($16) - lw $2,4($16) - addu $3,$3,-48 - subu $3,$3,$16 + addu $2,$sp,16 + sw $2,24($fp) + sw $sp,28($fp) + lw $2,96($fp) + lw $3,20($2) + lw $2,96($fp) + subu $2,$3,$2 + addu $2,$2,-56 + sra $2,$2,2 + sw $2,32($fp) + lw $2,96($fp) + lw $2,4($2) andi $2,$2,0x400 - .set noreorder - .set nomacro + beq $2,$0,$L2 + lw $2,96($fp) +#APP + l.s $f12,28($2) +#NO_APP +$L2: + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x1000 beq $2,$0,$L3 - sra $3,$3,2 - .set macro - .set reorder - - - l.d $f12,32($16) - - lw $2,4($16) - - andi $2,$2,0x800 - .set noreorder - .set nomacro - beq $2,$0,$L65 - li $6,4 - .set macro - .set reorder - - - l.d $f14,40($16) - + lw $2,96($fp) +#APP + l.d $f12,40($2) +#NO_APP $L3: - li $6,4 -$L65: - slt $2,$6,$3 - .set noreorder - .set nomacro - beq $2,$0,$L6 - addu $5,$4,16 - .set macro - .set reorder - - addu $4,$16,64 - addu $6,$3,-4 -$L8: - lw $2,0($4) - addu $4,$4,4 - addu $6,$6,-1 - sw $2,0($5) - .set noreorder - .set nomacro - bne $6,$0,$L8 - addu $5,$5,4 - .set macro - .set reorder - + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x800 + beq $2,$0,$L4 + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x1400 + beq $2,$0,$L4 + lw $2,96($fp) +#APP + l.s $f14,32($2) +#NO_APP +$L4: + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x2000 + beq $2,$0,$L5 + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x1400 + beq $2,$0,$L5 + lw $2,96($fp) +#APP + l.d $f14,48($2) +#NO_APP +$L5: + li $2,4 # 0x4 + sw $2,36($fp) $L6: - lw $25,0($16) - lw $4,48($16) - lw $5,52($16) - lw $6,56($16) - lw $7,60($16) + lw $2,36($fp) + lw $3,32($fp) + slt $2,$2,$3 + bne $2,$0,$L9 + b $L7 +$L9: + lw $2,36($fp) + sll $3,$2,2 + lw $2,28($fp) + addu $4,$3,$2 + lw $3,96($fp) + lw $2,36($fp) + sll $2,$2,2 + addu $2,$2,$3 + addu $2,$2,56 + lw $2,0($2) + sw $2,0($4) + lw $2,36($fp) + addu $2,$2,1 + sw $2,36($fp) + b $L6 +$L7: + lw $2,96($fp) + lw $25,0($2) + lw $2,96($fp) + lw $3,96($fp) + lw $6,96($fp) + lw $7,96($fp) + lw $4,56($2) + lw $5,60($3) + lw $6,64($6) + lw $7,68($7) jal $31,$25 - move $6,$2 - lw $4,12($16) - li $2,1 - .set noreorder - .set nomacro - beq $4,$2,$L64 - move $2,$0 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$0,$L61 - li $2,2 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L62 - li $2,3 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L62 - li $2,4 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L62 - li $2,5 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L63 - li $2,6 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L63 - li $2,7 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L61 - li $2,8 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L61 - li $2,9 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L61 - li $2,10 - .set macro - .set reorder - - .set noreorder - .set nomacro - beq $4,$2,$L61 - addu $2,$4,-11 - .set macro - .set reorder - - sltu $2,$2,2 - .set noreorder - .set nomacro - beq $2,$0,$L32 - li $2,13 - .set macro - .set reorder - - lw $2,8($16) - - sw $6,0($2) - lw $4,8($16) - .set noreorder - .set nomacro - j $L11 - sw $3,4($4) - .set macro - .set reorder - -$L32: - .set noreorder - .set nomacro - bne $4,$2,$L34 - li $2,14 - .set macro - .set reorder - - lw $2,8($16) - .set noreorder - .set nomacro - j $L11 + sw $2,40($fp) +#ifdef _MIPSEB + sw $3,52($fp) +#else + sw $3,48($fp) +#endif + sra $2,$3,31 +#ifdef _MIPSEB + sw $2,48($fp) +#else + sw $2,52($fp) +#endif + s.s $f0,56($fp) + s.d $f0,64($fp) + lw $2,96($fp) + sw $2,76($fp) + lw $3,76($fp) + lw $2,12($3) + sltu $2,$2,17 + beq $2,$0,$L10 + lw $3,76($fp) + lw $2,12($3) + sll $3,$2,2 + la $2,$L48 + addu $2,$3,$2 + lw $2,0($2) + .cpadd $2 + j $2 + .rdata + .align 2 +$L48: + .gpword $L13 + .gpword $L10 + .gpword $L14 + .gpword $L15 + .gpword $L16 + .gpword $L17 + .gpword $L18 + .gpword $L19 + .gpword $L20 + .gpword $L21 + .gpword $L22 + .gpword $L24 + .gpword $L24 + .gpword $L25 + .gpword $L26 + .gpword $L27 + .gpword $L28 + .text +$L13: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L14: + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lbu $2,43($fp) +#else + lbu $2,40($fp) +#endif + sb $2,0($3) + b $L10 +$L15: + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lbu $2,43($fp) +#else + lbu $2,40($fp) +#endif + sb $2,0($3) + b $L10 +$L16: + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lbu $2,43($fp) +#else + lbu $2,40($fp) +#endif + sb $2,0($3) + b $L10 +$L17: + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lhu $2,42($fp) +#else + lhu $2,40($fp) +#endif + sh $2,0($3) + b $L10 +$L18: + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lhu $2,42($fp) +#else + lhu $2,40($fp) +#endif + sh $2,0($3) + b $L10 +$L19: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L20: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L21: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L22: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L24: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + lw $2,96($fp) + lw $2,8($2) + addu $3,$2,4 +#ifdef _MIPSEB + lw $2,52($fp) +#else + lw $2,48($fp) +#endif + sw $2,0($3) + b $L10 +$L25: + lw $2,96($fp) + lw $2,8($2) + l.s $f0,56($fp) s.s $f0,0($2) - .set macro - .set reorder - -$L34: - .set noreorder - .set nomacro - bne $4,$2,$L36 - li $2,15 - .set macro - .set reorder - - lw $2,8($16) - + b $L10 +$L26: + lw $2,96($fp) + lw $2,8($2) + l.d $f0,64($fp) s.d $f0,0($2) - .set noreorder - .set nomacro - j $L64 - move $2,$0 - .set macro - .set reorder - -$L36: - .set noreorder - .set nomacro - beq $4,$2,$L61 - li $2,16 - .set macro - .set reorder - - .set noreorder - .set nomacro - bne $4,$2,$L64 - move $2,$0 - .set macro - .set reorder - - lw $3,4($16) - - andi $2,$3,0x1 - .set noreorder - .set nomacro - beq $2,$0,$L41 - li $2,1 - .set macro - .set reorder - - lw $3,16($16) - - .set noreorder - .set nomacro - bne $3,$2,$L42 - li $2,2 - .set macro - .set reorder - - lw $3,8($16) - lbu $2,0($6) - .set noreorder - .set nomacro - j $L11 + b $L10 +$L27: + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) + b $L10 +$L28: + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x1 + beq $2,$0,$L29 + lw $2,96($fp) + lw $3,16($2) + li $2,1 # 0x1 + bne $3,$2,$L30 + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + lbu $2,0($2) sb $2,0($3) - .set macro - .set reorder - -$L42: - .set noreorder - .set nomacro - bne $3,$2,$L44 - li $2,4 - .set macro - .set reorder - - lw $3,8($16) - lhu $2,0($6) - .set noreorder - .set nomacro - j $L11 + b $L10 +$L30: + lw $2,96($fp) + lw $3,16($2) + li $2,2 # 0x2 + bne $3,$2,$L32 + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + lhu $2,0($2) sh $2,0($3) - .set macro - .set reorder - -$L44: - .set noreorder - .set nomacro - bne $3,$2,$L46 - li $2,8 - .set macro - .set reorder - - lw $3,8($16) - lw $2,0($6) - .set noreorder - .set nomacro - j $L11 + b $L10 +$L32: + lw $2,96($fp) + lw $3,16($2) + li $2,4 # 0x4 + bne $3,$2,$L34 + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + lw $2,0($2) sw $2,0($3) - .set macro - .set reorder - -$L46: - .set noreorder - .set nomacro - bne $3,$2,$L48 - addu $2,$3,3 - .set macro - .set reorder - - lw $3,8($16) - lw $2,0($6) - + b $L10 +$L34: + lw $2,96($fp) + lw $3,16($2) + li $2,8 # 0x8 + bne $3,$2,$L36 + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + lw $2,0($2) sw $2,0($3) - lw $4,8($16) - lw $2,4($6) - .set noreorder - .set nomacro - j $L11 - sw $2,4($4) - .set macro - .set reorder - -$L48: - srl $5,$2,2 - addu $5,$5,-1 - .set noreorder - .set nomacro - bltz $5,$L11 - sll $2,$5,2 - .set macro - .set reorder - - addu $6,$2,$6 -$L52: - lw $2,0($6) - addu $6,$6,-4 - sll $3,$5,2 - lw $4,8($16) - addu $5,$5,-1 - addu $3,$3,$4 - .set noreorder - .set nomacro - bgez $5,$L52 + lw $2,96($fp) + lw $2,8($2) + addu $3,$2,4 + lw $2,40($fp) + addu $2,$2,4 + lw $2,0($2) sw $2,0($3) - .set macro - .set reorder - - .set noreorder - .set nomacro - j $L64 - move $2,$0 - .set macro - .set reorder - -$L41: - andi $2,$3,0x2 - .set noreorder - .set nomacro - beq $2,$0,$L11 - li $2,1 - .set macro - .set reorder - - lw $3,16($16) - - .set noreorder - .set nomacro - bne $3,$2,$L56 - li $2,2 - .set macro - .set reorder - -$L62: - lw $2,8($16) - .set noreorder - .set nomacro - j $L11 - sb $6,0($2) - .set macro - .set reorder - -$L56: - .set noreorder - .set nomacro - bne $3,$2,$L58 - li $2,4 - .set macro - .set reorder - -$L63: - lw $2,8($16) - .set noreorder - .set nomacro - j $L11 - sh $6,0($2) - .set macro - .set reorder - -$L58: - .set noreorder - .set nomacro - bne $3,$2,$L64 - move $2,$0 - .set macro - .set reorder - -$L61: - lw $2,8($16) - - sw $6,0($2) -$L11: + b $L10 +$L36: + lw $2,96($fp) + lw $2,16($2) + addu $2,$2,3 + srl $2,$2,2 + sw $2,72($fp) +$L38: + lw $2,72($fp) + addu $2,$2,-1 + sw $2,72($fp) + bgez $2,$L40 + b $L10 +$L40: + lw $4,96($fp) + lw $2,72($fp) + sll $3,$2,2 + lw $2,8($4) + addu $4,$3,$2 + lw $2,72($fp) + sll $3,$2,2 + lw $2,40($fp) + addu $2,$3,$2 + lw $2,0($2) + sw $2,0($4) + b $L38 +$L29: + lw $2,96($fp) + lw $2,4($2) + andi $2,$2,0x2 + beq $2,$0,$L10 + lw $2,96($fp) + lw $3,16($2) + li $2,1 # 0x1 + bne $3,$2,$L43 + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lbu $2,43($fp) +#else + lbu $2,40($fp) +#endif + sb $2,0($3) + b $L10 +$L43: + lw $2,96($fp) + lw $3,16($2) + li $2,2 # 0x2 + bne $3,$2,$L45 + lw $2,96($fp) + lw $3,8($2) +#ifdef _MIPSEB + lhu $2,42($fp) +#else + lhu $2,40($fp) +#endif + sh $2,0($3) + b $L10 +$L45: + lw $2,96($fp) + lw $3,16($2) + li $2,4 # 0x4 + bne $3,$2,$L10 + lw $2,96($fp) + lw $3,8($2) + lw $2,40($fp) + sw $2,0($3) +$L10: move $2,$0 -$L64: move $sp,$fp - lw $31,24($sp) - lw $fp,20($sp) - lw $16,16($sp) - - .set noreorder - .set nomacro + lw $31,88($sp) + lw $fp,84($sp) + addu $sp,$sp,96 j $31 - addu $sp,$sp,32 - .set macro - .set reorder - .end __builtin_avcall + .ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-8)" diff -uprN ffcall-1.10.orig/ffcall/avcall/avcall-mips.c ffcall-1.10/ffcall/avcall/avcall-mips.c --- ffcall-1.10.orig/ffcall/avcall/avcall-mips.c 2004-01-26 14:58:31.000000000 +0000 +++ ffcall-1.10/ffcall/avcall/avcall-mips.c 2005-03-20 00:57:11.000000000 +0000 @@ -3,6 +3,7 @@ /** Copyright 1993 Bill Triggs, <[EMAIL PROTECTED]> Copyright 1995-1999 Bruno Haible, <[EMAIL PROTECTED]> + Copyright 2005 Thiemo Seufer <[EMAIL PROTECTED]> This is free software distributed under the GNU General Public Licence described in the file COPYING. Contact the author if @@ -49,108 +50,122 @@ register func_pointer t9 __asm__("$25"); int __builtin_avcall(av_alist* l) { - register __avword* sp __asm__("$sp"); /* C names for registers */ - register __avword iret2 __asm__("$3"); - register float fret __asm__("$f0"); - register double dret __asm__("$f0"); + register __avword* sp __asm__("$sp"); /* C names for registers */ + register __avword iret2_tmp __asm__("$3"); + register float fret_tmp __asm__("$f0"); + register double dret_tmp __asm__("$f0"); __avword *space = __builtin_alloca(__AV_ALIST_WORDS * sizeof(__avword)); /* big space for child's stack frame */ __avword *argframe = (__avword*)sp; /* stack offset for argument list is 0 */ int arglen = l->aptr - l->args; - __avword i; - - if (l->flags & __AV_FLOAT_1) /* push leading float args */ - { - __asm__("l.d $f12,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,floatarg[0])); - if (l->flags & __AV_FLOAT_2) - __asm__("l.d $f14,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,floatarg[1])); - } + int i; + __avword iret; + long long iret2; + float fret; + double dret; + + /* load leading float args */ + if (l->flags & __AV_FLOAT_1) + __asm__("l.s $f12,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,floatarg[0])); + if (l->flags & __AV_DOUBLE_1) + __asm__("l.d $f12,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,doublearg[0])); + if ((l->flags & __AV_FLOAT_2) && (l->flags & (__AV_FLOAT_1 | __AV_DOUBLE_1))) + __asm__("l.s $f14,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,floatarg[1])); + if ((l->flags & __AV_DOUBLE_2) && (l->flags & (__AV_FLOAT_1 | __AV_DOUBLE_1))) + __asm__("l.d $f14,%1(%0)" : : "p" (l), "i" OFFSETOF(av_alist,doublearg[1])); for (i = 4; i < arglen; i++) /* push excess function args */ argframe[i] = l->args[i]; - i = (*(t9 = l->func))(l->args[0], l->args[1], /* call function with 1st 4 args */ - l->args[2], l->args[3]); + iret = (*(t9 = l->func))(l->args[0], l->args[1], /* call function with 1st 4 args */ + l->args[2], l->args[3]); + iret2 = iret2_tmp; + fret = fret_tmp; + dret = dret_tmp; /* save return value */ - if (l->rtype == __AVvoid) { - } else - if (l->rtype == __AVword) { - RETURN(__avword, i); - } else - if (l->rtype == __AVchar) { - RETURN(char, i); - } else - if (l->rtype == __AVschar) { - RETURN(signed char, i); - } else - if (l->rtype == __AVuchar) { - RETURN(unsigned char, i); - } else - if (l->rtype == __AVshort) { - RETURN(short, i); - } else - if (l->rtype == __AVushort) { - RETURN(unsigned short, i); - } else - if (l->rtype == __AVint) { - RETURN(int, i); - } else - if (l->rtype == __AVuint) { - RETURN(unsigned int, i); - } else - if (l->rtype == __AVlong) { - RETURN(long, i); - } else - if (l->rtype == __AVulong) { - RETURN(unsigned long, i); - } else - if (l->rtype == __AVlonglong || l->rtype == __AVulonglong) { - ((__avword*)l->raddr)[0] = i; + switch (l->rtype) { + default: + case __AVvoid: + break; + case __AVword: + RETURN(__avword, iret); + break; + case __AVchar: + RETURN(char, iret); + break; + case __AVschar: + RETURN(signed char, iret); + break; + case __AVuchar: + RETURN(unsigned char, iret); + break; + case __AVshort: + RETURN(short, iret); + break; + case __AVushort: + RETURN(unsigned short, iret); + break; + case __AVint: + RETURN(int, iret); + break; + case __AVuint: + RETURN(unsigned int, iret); + break; + case __AVlong: + RETURN(long, iret); + break; + case __AVulong: + RETURN(unsigned long, iret); + break; + case __AVlonglong: + case __AVulonglong: + ((__avword*)l->raddr)[0] = (__avword)(iret); ((__avword*)l->raddr)[1] = iret2; - } else - if (l->rtype == __AVfloat) { + break; + case __AVfloat: RETURN(float, fret); - } else - if (l->rtype == __AVdouble) { + break; + case __AVdouble: RETURN(double, dret); - } else - if (l->rtype == __AVvoidp) { - RETURN(void*, i); - } else - if (l->rtype == __AVstruct) { + break; + case __AVvoidp: + RETURN(void*, (__avword)iret); + break; + case __AVstruct: if (l->flags & __AV_PCC_STRUCT_RETURN) { /* pcc struct return convention: need a *(TYPE*)l->raddr = *(TYPE*)i; */ if (l->rsize == sizeof(char)) { - RETURN(char, *(char*)i); + RETURN(char, *(char*)(__avword)iret); } else if (l->rsize == sizeof(short)) { - RETURN(short, *(short*)i); + RETURN(short, *(short*)(__avword)iret); } else if (l->rsize == sizeof(int)) { - RETURN(int, *(int*)i); + RETURN(int, *(int*)(__avword)iret); } else if (l->rsize == sizeof(double)) { - ((int*)l->raddr)[0] = ((int*)i)[0]; - ((int*)l->raddr)[1] = ((int*)i)[1]; + ((int*)l->raddr)[0] = ((int*)(__avword)iret)[0]; + ((int*)l->raddr)[1] = ((int*)(__avword)iret)[1]; } else { int n = (l->rsize + sizeof(__avword)-1)/sizeof(__avword); while (--n >= 0) - ((__avword*)l->raddr)[n] = ((__avword*)i)[n]; + ((__avword*)l->raddr)[n] = ((__avword*)(__avword)iret)[n]; } } else { /* normal struct return convention */ if (l->flags & __AV_SMALL_STRUCT_RETURN) { if (l->rsize == sizeof(char)) { - RETURN(char, i); + RETURN(char, iret); } else if (l->rsize == sizeof(short)) { - RETURN(short, i); + RETURN(short, iret); } else if (l->rsize == sizeof(int)) { - RETURN(int, i); + RETURN(int, iret); } } } + break; } return 0; } diff -uprN ffcall-1.10.orig/ffcall/avcall/avcall.h.in ffcall-1.10/ffcall/avcall/avcall.h.in --- ffcall-1.10.orig/ffcall/avcall/avcall.h.in 2004-01-26 14:58:41.000000000 +0000 +++ ffcall-1.10/ffcall/avcall/avcall.h.in 2005-03-20 00:57:11.000000000 +0000 @@ -323,9 +323,11 @@ enum __AV_alist_flags #if defined(__i386__) || defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc64__) || defined(__alpha__) || defined(__arm__) || defined(__rs6000__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) || defined(__s390__) __AV_REGISTER_STRUCT_RETURN = 1<<9, #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) __AV_FLOAT_1 = 1<<10, __AV_FLOAT_2 = 1<<11, + __AV_DOUBLE_1 = 1<<12, + __AV_DOUBLE_2 = 1<<13, #endif __AV_flag_for_broken_compilers_that_dont_like_trailing_commas @@ -367,10 +369,11 @@ typedef struct __avword* iaptr; __avword iargs[6]; #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* store the floating-point arguments in an extra array */ int anum; - double floatarg[2]; + float floatarg[2]; + double doublearg[2]; #endif #if defined(__mipsn32__) || defined(__mips64__) /* store the floating-point arguments in an extra array */ @@ -447,7 +450,7 @@ typedef struct #define __av_start1(LIST) \ (LIST).aptr = &(LIST).args[0], #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) #define __av_start1(LIST) \ (LIST).anum = 0, \ (LIST).aptr = &(LIST).args[0], @@ -606,7 +609,7 @@ typedef struct #define __av_start_struct3(LIST) \ 0 #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) #define __av_reg_struct_return(LIST,TYPE_SIZE,TYPE_SPLITTABLE) \ ((TYPE_SIZE) == 1 || (TYPE_SIZE) == 2 || (TYPE_SIZE) == 4) /* Test __AV_SMALL_STRUCT_RETURN instead of __AV_REGISTER_STRUCT_RETURN. */ @@ -768,7 +771,7 @@ typedef struct /* `long long' fits in __avword. */ #define av_longlong __av_word #define av_ulonglong(LIST,VAL) __av_word(LIST,(unsigned long long)(VAL)) -#elif defined(__i386__) || defined(__m68k__) || defined(__mips__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__hppa__) || defined(__arm__) || defined(__rs6000__) || defined(__m88k__) || defined(__convex__) || defined(__s390__) +#elif defined(__i386__) || defined(__m68k__) || (defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__)) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__hppa__) || defined(__arm__) || defined(__rs6000__) || defined(__m88k__) || defined(__convex__) || defined(__s390__) /* `long long's are passed embedded on the arg stack. */ #define av_longlong(LIST,VAL) __av_longlong(LIST,long long,VAL) #define av_ulonglong(LIST,VAL) __av_longlong(LIST,unsigned long long,VAL) @@ -840,7 +843,7 @@ typedef struct #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* Up to 2 leading float or double non-varargs args can be passed in * float registers, but we also push them into the corresponding int @@ -851,22 +854,22 @@ typedef struct (++(LIST).aptr > __av_eptr(LIST) \ ? -1 : ((++(LIST).anum == 1 \ ? ((LIST).flags |= __AV_FLOAT_1, \ - ((float*)(LIST).floatarg)[1] = ((float*)(LIST).aptr)[-1] = (float)(VAL))\ - : (LIST).anum == 2 && ((LIST).flags & __AV_FLOAT_1) \ + (LIST).floatarg[0] = ((float*)(LIST).aptr)[-1] = (float)(VAL))\ + : (LIST).anum == 2 && (((LIST).flags & __AV_FLOAT_1) || ((LIST).flags & __AV_DOUBLE_1))\ ? ((LIST).flags |= __AV_FLOAT_2, \ - ((float*)(LIST).floatarg)[3] = ((float*)(LIST).aptr)[-1] = (float)(VAL))\ - : (*(float*)&(LIST).aptr[-1] = (float)(VAL))), \ + (LIST).floatarg[1] = ((float*)(LIST).aptr)[-1] = (float)(VAL))\ + : (((float*)(LIST).aptr)[-1] = (float)(VAL))), \ 0)) #define av_double(LIST,VAL) \ (((LIST).aptr = (__avword*)(((__avword)(LIST).aptr+15)&-8)) \ > __av_eptr(LIST) \ ? -1 : ((++(LIST).anum == 1 \ - ? ((LIST).flags |= __AV_FLOAT_1, \ - (LIST).floatarg[0] = ((double*)(LIST).aptr)[-1] = (double)(VAL))\ - : (LIST).anum == 2 && ((LIST).flags & __AV_FLOAT_1) \ - ? ((LIST).flags |= __AV_FLOAT_2, \ - (LIST).floatarg[1] = ((double*)(LIST).aptr)[-1] = (double)(VAL))\ + ? ((LIST).flags |= __AV_DOUBLE_1, \ + (LIST).doublearg[0] = ((double*)(LIST).aptr)[-1] = (double)(VAL))\ + : (LIST).anum == 2 && (((LIST).flags & __AV_FLOAT_1) || ((LIST).flags & __AV_DOUBLE_1))\ + ? ((LIST).flags |= __AV_DOUBLE_2, \ + (LIST).doublearg[1] = ((double*)(LIST).aptr)[-1] = (double)(VAL))\ : (((double*)(LIST).aptr)[-1] = (double)(VAL))), \ 0)) @@ -1145,7 +1148,7 @@ typedef struct 0))) #endif /* small structures < 1 word are adjusted depending on compiler */ -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) #define __av_struct_leftadjusted(LIST,TYPE,TYPE_SIZE,TYPE_ALIGN,ASSIGN,VAL) \ (((LIST).aptr = \ (__avword*)(((__avword)(LIST).aptr+(TYPE_SIZE)+(TYPE_ALIGN)-1) & -(long)(TYPE_ALIGN)))\di diff -uprN ffcall-1.10.orig/ffcall/callback/trampoline_r/tramp-mips.s ffcall-1.10/ffcall/callback/trampoline_r/tramp-mips.s --- ffcall-1.10.orig/ffcall/callback/trampoline_r/tramp-mips.s 2004-01-26 14:59:44.000000000 +0000 +++ ffcall-1.10/ffcall/callback/trampoline_r/tramp-mips.s 2005-03-20 00:57:11.000000000 +0000 @@ -17,12 +17,12 @@ .globl tramp .ent tramp tramp: - li $2,0x73550000 - ori $2,$2,0x4711 - li $25,0xbabe0000 - ori $25,$25,0xbec0 + /* We can assume that our own address (=tramp) is in $25. */ + lw $2,$LC0-tramp($25) + lw $25,$LC1-tramp($25) /* The called function expects to see its own address in $25. */ j $25 - /* Some Mips hardware running Irix-4.0.5 needs this nop. */ - nop + nop +$LC0: .word 0x73554711 +$LC1: .word 0xbabebec0 .end tramp diff -uprN ffcall-1.10.orig/ffcall/callback/trampoline_r/trampoline.c ffcall-1.10/ffcall/callback/trampoline_r/trampoline.c --- ffcall-1.10.orig/ffcall/callback/trampoline_r/trampoline.c 2005-03-23 19:25:26.000000000 +0000 +++ ffcall-1.10/ffcall/callback/trampoline_r/trampoline.c 2005-03-20 00:57:11.000000000 +0000 @@ -242,11 +242,7 @@ extern void __TR_clear_cache(); #define TRAMP_LENGTH 14 #define TRAMP_ALIGN 16 #endif -#if defined(__mips__) && !defined(__mipsn32__) -#define TRAMP_LENGTH 24 -#define TRAMP_ALIGN 4 -#endif -#ifdef __mipsn32__ +#if defined(__mips__) || defined(__mipsn32__) && !defined(__mips64__) #define TRAMP_LENGTH 24 #define TRAMP_ALIGN 4 #endif @@ -459,41 +455,7 @@ __TR_function alloc_trampoline_r (addres #define tramp_data(function) \ *(long *) (function + 2) #endif -#if defined(__mips__) && !defined(__mipsn32__) - /* function: - * li $2,<data>&0xffff0000 3C 02 hi16(<data>) - * ori $2,$2,<data>&0xffff 34 42 lo16(<data>) - * li $25,<address>&0xffff0000 3C 19 hi16(<address>) - * ori $25,$25,<address>&0xffff 37 39 lo16(<address>) - * j $25 03 20 00 08 - * nop 00 00 00 00 - */ - /* What about big endian / little endian ?? */ - *(short *) (function + 0) = 0x3C02; - *(short *) (function + 2) = (unsigned long) data >> 16; - *(short *) (function + 4) = 0x3442; - *(short *) (function + 6) = (unsigned long) data & 0xffff; - *(short *) (function + 8) = 0x3C19; - *(short *) (function +10) = (unsigned long) address >> 16; - *(short *) (function +12) = 0x3739; - *(short *) (function +14) = (unsigned long) address & 0xffff; - *(long *) (function +16) = 0x03200008; - *(long *) (function +20) = 0x00000000; -#define is_tramp(function) \ - *(unsigned short *) (function + 0) == 0x3C02 && \ - *(unsigned short *) (function + 4) == 0x3442 && \ - *(unsigned short *) (function + 8) == 0x3C19 && \ - *(unsigned short *) (function +12) == 0x3739 && \ - *(unsigned long *) (function +16) == 0x03200008 && \ - *(unsigned long *) (function +20) == 0x00000000 -#define hilo(hiword,loword) \ - (((unsigned long) (hiword) << 16) | (unsigned long) (loword)) -#define tramp_address(function) \ - hilo(*(unsigned short *) (function +10), *(unsigned short *) (function +14)) -#define tramp_data(function) \ - hilo(*(unsigned short *) (function + 2), *(unsigned short *) (function + 6)) -#endif -#ifdef __mipsn32__ +#if defined(__mips__) || defined(__mipsn32__) && !defined(__mips64__) /* function: * lw $2,16($25) 8F 22 00 10 * lw $25,20($25) 8F 39 00 14 @@ -502,7 +464,6 @@ __TR_function alloc_trampoline_r (addres * .word <data> <data> * .word <address> <address> */ - /* What about big endian / little endian ?? */ *(unsigned int *) (function + 0) = 0x8F220010; *(unsigned int *) (function + 4) = 0x8F390014; *(unsigned int *) (function + 8) = 0x03200008; @@ -510,10 +471,10 @@ __TR_function alloc_trampoline_r (addres *(unsigned int *) (function +16) = (unsigned int) data; *(unsigned int *) (function +20) = (unsigned int) address; #define is_tramp(function) \ - *(int *) (function + 0) == 0x8F220010 && \ - *(int *) (function + 4) == 0x8F390014 && \ - *(int *) (function + 8) == 0x03200008 && \ - *(int *) (function +12) == 0x00000000 + *(unsigned int *) (function + 0) == 0x8F220010 && \ + *(unsigned int *) (function + 4) == 0x8F390014 && \ + *(unsigned int *) (function + 8) == 0x03200008 && \ + *(unsigned int *) (function +12) == 0x00000000 #define tramp_address(function) \ *(unsigned int *) (function +20) #define tramp_data(function) \ @@ -597,14 +558,17 @@ __TR_function alloc_trampoline_r (addres * .dword <data> <data> * .dword <address> <address> */ - /* What about big endian / little endian ?? */ - *(long *) (function + 0) = 0xDF220010DF390018L; - *(long *) (function + 8) = 0x0320000800000000L; + *(unsigned int *) (function + 0) = 0xDF220010; + *(unsigned int *) (function + 4) = 0xDF390018; + *(unsigned int *) (function + 8) = 0x03200008; + *(unsigned int *) (function +12) = 0x00000000; *(unsigned long *) (function +16) = (unsigned long) data; *(unsigned long *) (function +24) = (unsigned long) address; #define is_tramp(function) \ - *(long *) (function + 0) == 0xDF220010DF390018L && \ - *(long *) (function + 8) == 0x0320000800000000L + *(unsigned int *) (function + 0) == 0xDF220010 && \ + *(unsigned int *) (function + 4) == 0xDF390018 && \ + *(unsigned int *) (function + 8) == 0x03200008 && \ + *(unsigned int *) (function +12) == 0x00000000 #define tramp_address(function) \ *(unsigned long *) (function +24) #define tramp_data(function) \ diff -uprN ffcall-1.10.orig/ffcall/callback/vacall_r/vacall_r.h.in ffcall-1.10/ffcall/callback/vacall_r/vacall_r.h.in --- ffcall-1.10.orig/ffcall/callback/vacall_r/vacall_r.h.in 2004-06-02 19:18:12.000000000 +0000 +++ ffcall-1.10/ffcall/callback/vacall_r/vacall_r.h.in 2005-03-20 00:57:12.000000000 +0000 @@ -331,7 +331,7 @@ enum __VA_alist_flags #if defined(__i386__) || defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc64__) || defined(__alpha__) || defined(__arm__) || defined(__rs6000__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) || defined(__s390__) __VA_REGISTER_STRUCT_RETURN = 1<<10, #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) __VA_FLOAT_1 = 1<<11, __VA_FLOAT_2 = 1<<12, #endif @@ -395,7 +395,7 @@ typedef struct float farg[4]; double darg[2]; #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) int anum; float farg[2]; double darg[2]; @@ -545,11 +545,11 @@ typedef __va_alist* va_alist; #define __va_start_struct1(LIST,TYPE_SIZE,TYPE_ALIGN,TYPE_SPLITTABLE) \ 0 #endif -#if defined(__mips__) && !defined(__mipsn32__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__m88k__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__m88k__) #define __va_reg_struct_return(LIST,TYPE_SIZE,TYPE_SPLITTABLE) \ ((TYPE_SIZE) == 1 || (TYPE_SIZE) == 2 || (TYPE_SIZE) == 4) /* Test __VA_SMALL_STRUCT_RETURN instead of __VA_REGISTER_STRUCT_RETURN. */ -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) #define __va_start_struct1(LIST,TYPE_SIZE,TYPE_ALIGN,TYPE_SPLITTABLE) \ ((LIST)->anum++, \ 0 \ @@ -651,7 +651,7 @@ typedef __va_alist* va_alist; /* Padding of non-struct arguments. */ #define __va_argsize(TYPE_SIZE) \ (((TYPE_SIZE) + sizeof(__vaword)-1) & -(long)sizeof(__vaword)) -#if defined(__i386__) || defined(__m68k__) || defined(__mips__) && !defined(__mipsn32__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__alpha__) || defined(__arm__) || (defined(__rs6000__) && (defined(_AIX) || (defined(__MACH__) && defined(__APPLE__)))) || defined(__m88k__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) +#if defined(__i386__) || defined(__m68k__) || defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__alpha__) || defined(__arm__) || (defined(__rs6000__) && (defined(_AIX) || (defined(__MACH__) && defined(__APPLE__)))) || defined(__m88k__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) /* args grow up */ /* small structures < 1 word are adjusted depending on compiler */ #define __va_arg_leftadjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ @@ -737,20 +737,26 @@ typedef __va_alist* va_alist; (LIST)->aptr + ((-(TYPE_SIZE)) & 3) \ ) #endif -#if defined(__i386__) || defined(__alpha__) || defined(__ia64__) +#if defined(__i386__) || defined(__alpha__) || defined(__ia64__) || ((defined(__mipsn32__) || defined(__mips64__)) && defined(_MIPSEL)) /* little endian -> small args < 1 word are adjusted to the left */ #define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ __va_arg_leftadjusted(LIST,TYPE_SIZE,TYPE_ALIGN) #endif -#if defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc__) || defined(__sparc64__) || defined(__hppa__) || defined(__arm__) || defined(__rs6000__) || defined(__m88k__) || defined(__convex__) || defined(__s390__) +#if defined(__m68k__) || ((defined(__mipsn32__) || defined(__mips64__)) && defined(_MIPSEB)) || defined(__sparc__) || defined(__sparc64__) || defined(__hppa__) || defined(__arm__) || defined(__rs6000__) || defined(__m88k__) || defined(__convex__) || defined(__s390__) /* big endian -> small args < 1 word are adjusted to the right */ #define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ __va_arg_rightadjusted(LIST,TYPE_SIZE,TYPE_ALIGN) #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) +#ifdef _MIPSEB /* big endian -> small args < 1 word are adjusted to the right */ #define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ ((LIST)->anum++, __va_arg_rightadjusted(LIST,TYPE_SIZE,TYPE_ALIGN)) +#else /* _MIPSEL */ +/* little endian -> small args < 1 word are adjusted to the left */ +#define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ + ((LIST)->anum++, __va_arg_leftadjusted(LIST,TYPE_SIZE,TYPE_ALIGN)) +#endif #endif #if defined(__x86_64__) /* the first 6 argument words are passed in registers */ @@ -828,7 +834,7 @@ typedef __va_alist* va_alist; #if defined(__i386__) || defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc__) || defined(__sparc64__) || defined(__alpha__) || defined(__arm__) || defined(__rs6000__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) || defined(__s390__) #define __va_align_double(LIST) #endif -#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || defined(__m88k__) /* __VA_alignof(double) > sizeof(__vaword) */ #define __va_align_double(LIST) \ (LIST)->aptr = ((LIST)->aptr + sizeof(double)-1) & -(long)sizeof(double), @@ -893,7 +899,7 @@ typedef __va_alist* va_alist; )) #endif #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* The first 0,1,2 registers are stored elsewhere if they are floating-point * parameters. */ @@ -1092,7 +1098,7 @@ typedef __va_alist* va_alist; __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ ) #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* small structures < 1 word are adjusted depending on compiler */ #define __va_arg_struct(LIST,TYPE_SIZE,TYPE_ALIGN) \ (__va_align_struct(LIST,TYPE_SIZE,TYPE_ALIGN) \ diff -uprN ffcall-1.10.orig/ffcall/m4/general.m4 ffcall-1.10/ffcall/m4/general.m4 --- ffcall-1.10.orig/ffcall/m4/general.m4 2002-08-02 11:56:46.000000000 +0000 +++ ffcall-1.10/ffcall/m4/general.m4 2005-03-20 19:59:13.000000000 +0000 @@ -150,7 +150,7 @@ changequote(,)dnl host_cpu=arm ;; changequote([,])dnl - mips ) + mips* ) AC_CACHE_CHECK([for 64-bit MIPS], cl_cv_host_mips64, [ AC_EGREP_CPP(yes, [#if defined(_MIPS_SZLONG) @@ -163,6 +163,8 @@ AC_EGREP_CPP(yes, ]) if test $cl_cv_host_mips64 = yes; then host_cpu=mips64 +else + host_cpu=mips fi ;; dnl UltraSPARCs running Linux have `uname -m` = "sparc64", but the C compiler @@ -213,7 +215,7 @@ changequote(,)dnl host_cpu=arm ;; changequote([,])dnl - mips ) + mips* ) AC_CACHE_CHECK([for 64-bit MIPS], cl_cv_host_mips64, [ AC_EGREP_CPP(yes, [#if defined(_MIPS_SZLONG) @@ -239,6 +241,8 @@ AC_EGREP_CPP(yes, ]) if test $cl_cv_host_mipsn32 = yes; then host_cpu=mipsn32 +else + host_cpu=mips fi fi ;; diff -uprN ffcall-1.10.orig/ffcall/vacall/vacall.h.in ffcall-1.10/ffcall/vacall/vacall.h.in --- ffcall-1.10.orig/ffcall/vacall/vacall.h.in 2004-06-02 18:47:04.000000000 +0000 +++ ffcall-1.10/ffcall/vacall/vacall.h.in 2005-03-20 00:57:12.000000000 +0000 @@ -331,7 +331,7 @@ enum __VA_alist_flags #if defined(__i386__) || defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc64__) || defined(__alpha__) || defined(__arm__) || defined(__rs6000__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) || defined(__s390__) __VA_REGISTER_STRUCT_RETURN = 1<<10, #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) __VA_FLOAT_1 = 1<<11, __VA_FLOAT_2 = 1<<12, #endif @@ -395,7 +395,7 @@ typedef struct float farg[4]; double darg[2]; #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) int anum; float farg[2]; double darg[2]; @@ -545,11 +545,11 @@ typedef __va_alist* va_alist; #define __va_start_struct1(LIST,TYPE_SIZE,TYPE_ALIGN,TYPE_SPLITTABLE) \ 0 #endif -#if defined(__mips__) && !defined(__mipsn32__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__m88k__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__m88k__) #define __va_reg_struct_return(LIST,TYPE_SIZE,TYPE_SPLITTABLE) \ ((TYPE_SIZE) == 1 || (TYPE_SIZE) == 2 || (TYPE_SIZE) == 4) /* Test __VA_SMALL_STRUCT_RETURN instead of __VA_REGISTER_STRUCT_RETURN. */ -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) #define __va_start_struct1(LIST,TYPE_SIZE,TYPE_ALIGN,TYPE_SPLITTABLE) \ ((LIST)->anum++, \ 0 \ @@ -651,7 +651,7 @@ typedef __va_alist* va_alist; /* Padding of non-struct arguments. */ #define __va_argsize(TYPE_SIZE) \ (((TYPE_SIZE) + sizeof(__vaword)-1) & -(long)sizeof(__vaword)) -#if defined(__i386__) || defined(__m68k__) || defined(__mips__) && !defined(__mipsn32__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__alpha__) || defined(__arm__) || (defined(__rs6000__) && (defined(_AIX) || (defined(__MACH__) && defined(__APPLE__)))) || defined(__m88k__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) +#if defined(__i386__) || defined(__m68k__) || defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || (defined(__sparc__) && !defined(__sparc64__)) || defined(__alpha__) || defined(__arm__) || (defined(__rs6000__) && (defined(_AIX) || (defined(__MACH__) && defined(__APPLE__)))) || defined(__m88k__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) /* args grow up */ /* small structures < 1 word are adjusted depending on compiler */ #define __va_arg_leftadjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ @@ -747,7 +747,7 @@ typedef __va_alist* va_alist; #define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ __va_arg_rightadjusted(LIST,TYPE_SIZE,TYPE_ALIGN) #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* big endian -> small args < 1 word are adjusted to the right */ #define __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ ((LIST)->anum++, __va_arg_rightadjusted(LIST,TYPE_SIZE,TYPE_ALIGN)) @@ -828,7 +828,7 @@ typedef __va_alist* va_alist; #if defined(__i386__) || defined(__m68k__) || defined(__mipsn32__) || defined(__mips64__) || defined(__sparc__) || defined(__sparc64__) || defined(__alpha__) || defined(__arm__) || defined(__rs6000__) || defined(__convex__) || defined(__ia64__) || defined(__x86_64__) || defined(__s390__) #define __va_align_double(LIST) #endif -#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || defined(__m88k__) /* __VA_alignof(double) > sizeof(__vaword) */ #define __va_align_double(LIST) \ (LIST)->aptr = ((LIST)->aptr + sizeof(double)-1) & -(long)sizeof(double), @@ -893,7 +893,7 @@ typedef __va_alist* va_alist; )) #endif #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* The first 0,1,2 registers are stored elsewhere if they are floating-point * parameters. */ @@ -1092,7 +1092,7 @@ typedef __va_alist* va_alist; __va_arg_adjusted(LIST,TYPE_SIZE,TYPE_ALIGN) \ ) #endif -#if defined(__mips__) && !defined(__mipsn32__) +#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) /* small structures < 1 word are adjusted depending on compiler */ #define __va_arg_struct(LIST,TYPE_SIZE,TYPE_ALIGN) \ (__va_align_struct(LIST,TYPE_SIZE,TYPE_ALIGN) \ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]