More on FreeBSD/amd64

Ian Lynagh igloo at
Mon Apr 2 20:34:17 EDT 2007

Hi Gregory,

On Mon, Apr 02, 2007 at 11:57:49AM -0400, Gregory Wright wrote:
> On Apr 1, 2007, at 6:22 PM, Ian Lynagh wrote:
> >Does the 6.6 one work with 6.4.2?:
> >
> >puts :: String -> IO ()
> >puts s = do write_rawBuffer 1 (unsafeCoerce# (packCString# s))
> >                            0 (fromIntegral (length s))
> >            return ()
> >
> >(packCString# come from GHC.Pack)
> Still doesn't work.  If I include the definition of write_rawBuffer just
> above puts (I can't import GHC.Handle because of the dependency loop)
> and dangerously change CInt to Int in the signature (can't import
> Foreign.C.Types for the same reason)

Hmm, the foreign import types already look wrong, in both 6.4.2 and the
HEAD. For now I recommend changing the definition in include/HsBase.h to
only take and return HsInt, and to do the casting on the C side.

# -----------------------------
__hscore_PrelHandle_write( HsInt fd, HsAddr ptr, HsInt off, HsInt sz )
  return write(fd,(char *)ptr + off, (int)sz);
# -----------------------------

# -----------------------------
import GHC.List
import GHC.Pack
import GHC.Num

puts :: String -> IO ()
puts s = do write_rawBuffer 1 (unsafeCoerce# (packCString# s))
                            0 (length s)
            return ()
# -----------------------------

You'll also need to fix the types of the imports in GHC.Handle (there
are two of them), and their uses. I successfully built 6.4.2 with these

[some hours pass]

Actually, HsBase.h contains many type mismatches (I've just pushed a
patch to the HEAD), and I think there are more lurking in the base
package. I'll probably resume my hunt tomorrow. It's probably not worth
debugging further with 6.4 unless we first backport these fixes; it's
not particularly unlikely that one of them is the root cause of the bug,
after all.


More information about the Glasgow-haskell-users mailing list