#1424: Argument corruption in FFI with many arguments (maybe 64-bit related)
-----------------------------+----------------------------------------------
  Reporter:  guest           |          Owner:                
      Type:  bug             |         Status:  new           
  Priority:  normal          |      Milestone:                
 Component:  Compiler (FFI)  |        Version:  6.6.1         
  Severity:  normal          |       Keywords:  ffi           
Difficulty:  Unknown         |             Os:  Linux         
  Testcase:                  |   Architecture:  x86_64 (amd64)
-----------------------------+----------------------------------------------
With many arguments, something strange occurs in argument passing with
 FFI.  The misbehaviour only occurs on my 64-bit machine; the program works
 correctly on my 32-bit one.  It seems as though an extra value is inserted
 into the argument list.

 First, here is the code.  There's a foreign function that takes 10
 doubles.

 ----
 {{{
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ cat c.c
 fC (double a,
     double b,
     double c,
     double d,
     double e,
     double f,
     double g,
     double h,
     double i,
     double j)
 {
     printf("%f %f %f %f %f %f %f %f %f %f\n", a,b,c,d,e,f,g,h,i,j);
 }
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ cat Ffi.hs
 {-# OPTIONS_GHC -fglasgow-exts #-}

 f :: Double -> Double -> Double -> Double -> Double -> Double -> Double ->
 Double -> Double -> Double -> IO ()
 f a b c d e f g h i j = do
   print [a, b, c, d, e, f, g, h, i, j]
   fC a b c d e f g h i j

 foreign import ccall unsafe "fC" fC ::
       Double -> Double -> Double
    -> Double -> Double -> Double
    -> Double -> Double -> Double -> Double -> IO ()

 main = do
   f 1 2 3 4 5 6 7 8 9 10
 }}}
 ----

 Here is the correct behaviour, on my 32-bit machine.  The important output
 is the line starting with "1.000000 2.000000 3.00[...]"

 ----
 {{{
 [EMAIL PROTECTED]:~/tmp/ffi$ gcc -c c.c
 c.c: In function ‘fC’:
 c.c:12: warning: incompatible implicit declaration of built-in function
 ‘printf’
 [EMAIL PROTECTED]:~/tmp/ffi$ ghc --make Ffi c.o
 [1 of 1] Compiling Main             ( Ffi.hs, Ffi.o )
 Linking Ffi ...
 ./[EMAIL PROTECTED]:~/tmp/ffi$ ./Ffi
 [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]
 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
 9.000000 10.000000
 [EMAIL PROTECTED]:~/tmp/ffi$ ghc -v
 Glasgow Haskell Compiler, Version 6.6.1, for Haskell 98, compiled by GHC
 version 6.6.1
 Using package config file: /usr/lib/ghc-6.6.1/package.conf
 Using package config file: /home/chris/.ghc/i386-linux-6.6.1/package.conf
 wired-in package base mapped to base-2.1.1
 wired-in package rts mapped to rts-1.0
 wired-in package haskell98 mapped to haskell98-1.0
 wired-in package template-haskell mapped to template-haskell-2.1
 Hsc static flags: -static
 *** Deleting temp files:
 Deleting:
 *** Deleting temp dirs:
 Deleting:
 ghc-6.6.1: no input files
 Usage: For basic information, try the `--help' option.
 [EMAIL PROTECTED]:~/tmp/ffi$ gcc -v
 Using built-in specs.
 Target: i486-linux-gnu
 Configured with: ../src/configure -v --enable-
 languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-
 shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
 --enable-threads=posix --enable-nls --with-gxx-include-
 dir=/usr/include/c++/4.1.3 --program-suffix=-4.1 --enable-__cxa_atexit
 --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-
 tune=i686 --enable-checking=release i486-linux-gnu
 Thread model: posix
 gcc version 4.1.3 20070601 (prerelease) (Debian 4.1.2-12)
 }}}
 ----

 Here is the bad behaviour, on my 64-bit machine.  Note that the Haskell
 list has the values [1..10], but the C arguments are 1,2,3,4,5,6,7,8,0,9
 (a zero is inserted between 8 and 9).

 ----
 {{{
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ gcc -c c.c
 c.c: In function ‘fC’:
 c.c:12: warning: incompatible implicit declaration of built-in function
 ‘printf’
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ ghc --make Ffi c.o
 [1 of 1] Compiling Main             ( Ffi.hs, Ffi.o )
 Linking Ffi ...
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ ./Ffi
 [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]
 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000
 0.000000 9.000000
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ ghc -v
 Glasgow Haskell Compiler, Version 6.6.1, for Haskell 98, compiled by GHC
 version 6.6.1
 Using package config file: /usr/lib/ghc-6.6.1/package.conf
 Using package config file: /home/chris/.ghc/x86_64-
 linux-6.6.1/package.conf
 wired-in package base mapped to base-2.1.1
 wired-in package rts mapped to rts-1.0
 wired-in package haskell98 mapped to haskell98-1.0
 wired-in package template-haskell mapped to template-haskell-2.1
 Hsc static flags: -static
 *** Deleting temp files:
 Deleting:
 *** Deleting temp dirs:
 Deleting:
 ghc-6.6.1: no input files
 Usage: For basic information, try the `--help' option.
 [EMAIL PROTECTED]:~/dev/haskell/ffi$ gcc -v
 Using built-in specs.
 Target: x86_64-linux-gnu
 Configured with: ../src/configure -v --enable-
 languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-
 shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
 --enable-threads=posix --enable-nls --with-gxx-include-
 dir=/usr/include/c++/4.1.3 --program-suffix=-4.1 --enable-__cxa_atexit
 --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-
 checking=release x86_64-linux-gnu
 Thread model: posix
 gcc version 4.1.3 20070429 (prerelease) (Debian 4.1.2-5)
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1424>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to