More on Ptr types

Alastair Reid reid at cs.utah.edu
Tue Jun 11 08:09:33 EDT 2002


If I understand you correctly, your concern is that a pointer
argument/result might be passed differently depending on what it is a
pointer to.

We already have a special case for FunPtr because they can be
different sizes from normal Ptrs (especially on a Harvard
architecture).  What I think you're suggesting is that we might
need to make a special case for other pointer types too.

This feels like a very unlikely thing to happen and I don't understand
it yet so I propose the following (btw note that I don't speak for the
whole FFI group).

Put off acting on this until we find a platform like this.  I believe
that all currently supported platyforms are not like this because if
they were we'd have noticed when we ported the compiler to this
platform.

On finding a platform like this, we can do one of:

1) Define a new calling convention ccall-plus (or whatever) which is
   just like the ccall convention except that the extloc strings can
   contain extra information to resolve the problem.

2) Require any affected functions to go through C wrappers which do the
   coercion.

   My feeling is that this will be viable because I suspect there
   would be something very unusual about the pointers which are passed
   differently (e.g., they will be pointers into I/O space or pointers
   to 32-bit aligned memory) so they will be rare and easy to find.

3) Find a way to add the missing type information to the Haskell type.
   I think this is much more than being careful to use

      Ptr (Ptr DB)

   instead of 

      Ptr DB

   because I would be hugely surprised if void* and void** had different
   representations.  Rather, I think any differences would only show
   between types like these:

     char*
     char[1 << 16] *
     char[1 << 32] *

   Haskell doesn't have a notion of sized types so we would deal with this
   either by extending Haskell (yoiks!) or by encoding the information
   using something like this:

     data Ptr8  a   -- pointer to 8-bit aligned object
     data Ptr16 a   -- pointer to 16-bit aligned object
     data Ptr32 a   -- pointer to 32-bit aligned object
     data Ptr64 a   -- pointer to 64-bit aligned object

  That is, we'd extend the FunPtr approach in some appropriate way.

  (Even if Haskell did have a notion of sized types, it wouldn't be
  enough because I'll bet there would be non-standard extensions which
  let C programmers override the default alignment of a type.)


-- 
Alastair Reid        reid at cs.utah.edu        http://www.cs.utah.edu/~reid/



More information about the FFI mailing list