[MLton] Port to HP-UX

Ville Laurikari ville@laurikari.net
Tue, 25 Apr 2006 19:18:17 +0300


On Mon, Apr 24, 2006 at 02:47:27PM -0700, Stephen Weeks wrote:
> The offending four fields of s, which is of type GC_state, are all of
> type GC_thread, declared in gc.h with a typedef:
> 
>   typedef struct GC_thread {
>   ... struct fields omitted ...
>   } *GC_thread;
> 
> So, it looks like we're relying on the fact that a pointer to a
> GC_thread can be treated as a pointer to a "pointer", where "pointer"
> is a typedef for char*.  I don't know of a better way in C to code

After some googling I found a working (although a bit ugly) solution.
C99 explicitly allows type-punning using unions, so declaring

        union { 
                GC_thread *t;
                pointer *p;
        } u;

and then converting the pointers using the union

        u.t = &s->callFromCHandler;
        maybeCall (f, s, u.p);
        u.t = &s->currentThread;
        maybeCall (f, s, u.p);
        u.t = &s->savedThread;
        maybeCall (f, s, u.p);
        u.t = &s->signalHandler;
        maybeCall (f, s, u.p);

avoids the warnings.  The same trick could probably be applied to the
other places where we currently just ignore the C99 violation using
-fno-strict-aliasing.

-- 
http://www.iki.fi/vl/