Hi Christoph,

Someone who knows more will be able to get a better answer, but I don't think there is much of an issue here:
when using the C API to register local roots (CAMLparam, CAMLlocal, etc), these roots are in effect
stored in the C stack.  When raising an exception the stack is _cut down_ and all those roots
are promptly forgotten (as they should be).

Cheers,
Nicolas


On Sat, Feb 11, 2017 at 3:02 PM, Christoph Höger <christoph.hoeger@celeraone.com> wrote:
Dear all,

while studying camls native code generation and garbage collection strategy, I came upon Connor Benner's bachelor thesis from 2012, where he implemented a llvm backend for ocamlopt. One intriguing remark mentioned OCamls exception mechanism as basically consisting a pointer to the stack frame of the last exception handler in a special register (r14, when I recall correctly). Throwing an exception that becomes a mov/pop/ret operation. This however, seems to interfere with garbage collection: From the C-API, it seems that all local roots are stored in the frametable via some special macros (e.g. CAMLParam, CAMLlocal).

When control just returns from a stack frame, how are the entries removed from the frametable?

I would be glad, if someone could answer this or point me to the relevant documentation (if any exists).

thanks,

Christoph