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
_______________________________________________ Cvs-ghc mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/cvs-ghc
