Profiling makes FFI Marshalling of Doubles and Int64s fail

Roberto Zunino zunino at
Tue Sep 14 19:33:16 EDT 2004

Bayley, Alistair wrote:
> I've built a small test case. When I compile with:
>   ghc Main.hs test.c -o Main.exe
> ... the (correct) output from Main.exe is:
> 123.0
> 5678901234567890
> And when I compile with:
>   ghc -prof Main.hs test.c -o Main.exe
> ... the (incorrect) output from Main.exe is:
> 1.0
> 986516178

I don't know if this helps, but I want to share it anyway.

I made some tests and saw that compiling with -fvia-C also gives the 
(incorrect) 986516178, while -fasm yields the expected value. I am using 
Linux/x86 here, so YMMV.

However, compiling with

   ghc -prof Main.hs test.c -#include test.h

or s/-prof/-fvia-C/, works fine, provided test.h contains the correct 
function prototypes.

------ test.h
long long myInt64(void);
double myDouble(void);

AFAICS, it seems as the asm code generator knows about the Haskell types 
and therefore knows how to fetch the bits correctly, while the via-C 
code generator simply uses the C function calls (without prototypes), so 
functions return types are defaulted to int.

Also, you can try adding -Wall and see if the C compiler warns about 
this (mine does).

The GHC user's guide (section 8.2.2) is also insightful. It seems that 
using C headers is pretty much required, or, as the guide itself says, 
"You're crazy not to do it". ;-)

Roberto Zunino.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 252 bytes
Desc: OpenPGP digital signature
Url :

More information about the Glasgow-haskell-users mailing list