[MLton] Re: MLton and shared libraries

Stephen Weeks MLton@mlton.org
Wed, 20 Apr 2005 11:11:38 -0700


> Program received signal SIGSEGV, Segmentation fault.
> Chunk0 () at test.1.c:5084
> 5084            S(Word32, 0) = 0;
...
> Since S is defined as
> 
> #define S(ty, i) *(ty*)(StackTop + (i))
> 
> in c-chunk.h, this is merely a write to the first element
> of the stack. Which shouldn't be able to fail unless the
> GC hasn't been initialized - I think.

That seems right to me.

> Apropos, should gcState.isOriginal be true after a call
> to GC_init ?

Yes, unless the command line has "@MLton load-world ...".

> Anyways, Chunk 0 is the only chunk in test.1.c and the
> offending line is in the very end:
...
> L_1:
>          S(Word32, 0) = 0;          ;;; <- HERE
>          Push (4);
>          FlushFrontier();
>          FlushStackTop();
>          GC_gc (GCState, 0x45C, 0x0, __FILE__, __LINE__);
>          CacheFrontier();
>          CacheStackTop();
> L_0:
>          Push (-4);
>          goto L_4;
...
> case 0:
>          goto L_0;

This looks like the first call to the GC in the program, which is to
make space to allocate the globals (presumably there is a limit check
that fails and jumps to L_1).  The "S(Word32, 0) = 0" stores the
return address (0) on the stack.  The return address (0) is handled 
by the "case 0:", which will jump to the right return code (L_0),
although in this case, the program isn't multithreaded, so MLton knows
to generate code to fall through to the L_0 block without ever
checking the return address.

Here are some suggestions.

 * step through GC_init and make sure it's actually running and that
   the stack is allocated.
 * recompile the runtime with various debugging options
   (DEBUG_DETAILED, DEBUG_STACKS, ...).
 * step through the MLton-generated C code starting as soon as Chunk0
   is entered and verify that the stack looks good.