Strange GHC bug
Sean Seefried
sseefried at cse.unsw.edu.au
Wed Feb 11 03:35:56 EST 2004
Hi all,
I'm came across the *strangest* build problem. (I was compiling the 8
February 2004 GHC HEAD.) It seems that if you compile libraries with
the -Onot flag then data types are exported abstractly! I first became
aware of this problem while trying to build
base/Foreign/Marshall/Alloc.o. I received the following error:
-------------
../../ghc/compiler/ghc-inplace -H16m -O
-I/home/sseefried/local-ppc7400/include
-L/home/sseefried/local-ppc7400/lib -framework-path
/home/sseefried/Library/Fram
eworks -framework HaskellSupport -fglasgow-exts -cpp -Iinclude
-#include HsBase.
h -funbox-strict-fields -package-name base -H32 -Onot -Rghc-timing
-c Foreig
n/Marshal/Alloc.hs -o Foreign/Marshal/Alloc.o -ohi
Foreign/Marshal/Alloc.hi
Foreign/Marshal/Alloc.hs:155:0:
Unacceptable argument type in foreign declaration: CSize
When checking declaration:
foreign import ccall unsafe "static stdlib.h &malloc" _malloc
:: CSize
-> IO (
Ptr a)
Foreign/Marshal/Alloc.hs:156:0:
Unacceptable argument type in foreign declaration: CSize
When checking declaration:
foreign import ccall unsafe "static stdlib.h &realloc" _realloc
:: Ptr a
-> CS
ize -> IO (Ptr b)
<<ghc: 11741976 bytes, 27 GCs, 553492/1069000 avg/max bytes residency
(2 samples
), 6M in use, 0.02 INIT (0.01 elapsed), 0.20 MUT (0.29 elapsed), 0.19
GC (0.12 e
lapsed) :ghc>>
make[1]: *** [Foreign/Marshal/Alloc.o] Error 1
--------------
I tracked this problem down to an error that is defined in
ghc/compiler/typecheck/TcForeign.lhs.
I quickly discovered that the argument type of a foreign import dynamic
must be marshalable type or a newtype of such a type. I looked into
Foreign/C/Types.hs and found that CSize should indeed be a newtype of a
marshalable type. So what was the problem? I decided to look at the
interface file Foreign/C/Types.hi using the --show-iface flag.
To my surprise I got the following!
6 newtype CSize
Variances []
RecFlag NonRecursive
Generics: yes
{- abstract -}
When I removed the -Onot flag what I got was this:
6 newtype CSize
Variances []
RecFlag NonRecursive
Generics: yes
= CSize GHC.Word.Word32{1} Stricts: _
This is obviously correct.
So is this known behaviour and if so, why does it happen?
Sean
More information about the Cvs-ghc
mailing list