
#8281: The impossible happened: primRepToFFIType -------------------------------------+------------------------------------- Reporter: tibbe | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.6.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D3619 Wiki Page: | -------------------------------------+------------------------------------- Comment (by hvr): Fwiw, re documenting `UnliftedFFITypes` for unpinned `ByteArray#s` I (re)stumbled over this old authoritative sounding email (https://mail.haskell.org/pipermail/haskell-cafe/2014-June/114761.html) from Johan Tibell which stated
There is a way to pass an unpinned `ByteArray#` (or `MutableByteArray#`, but the former seems right in your case) to a foreign call, using the `UnliftedFFITypes` language extension. The `ByteArray#` is **guaranteed to not to be moved for the duration of the call**. The code should treat the `ByteArray#` argument as if it was a pointer to bytes. You will need to do any address offset computations on the C side (i.e. pass any offsets you need as extra argument to your C function).
...which might explain why there's a lot of code out there (including my own) which relies on that guarantee to be upheld (including for `safe` FFI calls). -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8281#comment:39 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler