Question regarding management of JIT code
David Malcolm
dmalcolm@redhat.com
Thu Jan 1 00:00:00 GMT 2015
On Tue, 2015-04-21 at 08:02 +0100, Dibyendu Majumdar wrote:
> Hi Dave,
>
> As I mentioned to you off list I am creating a JIT compiled version of
> Lua called Ravi. Right now I am using LLVM but I would also like to
> offer an alternative based on libgccjit.
>
> Lua is a garbage collected language. The way I have implemented the
> JIT compiler is that each Lua function gets compiled on its own, and
> in LLVM parlance is put in its own Module. The Module in LLVM is
> equivalent to a compilation unit in C. While one can put multiple
> functions in a Module I do not do so because by creating separate
> Modules for each function I can simply allow Lua's garbage collector
> to to get rid of unused functions, releasing the Module and resources.
>
> Is there a similar capability in libgccjit?
You can use multiple gcc_jit_context instances to do this.
Presumably you have some one-time initialization to do, e.g. creating
common types. You can create these within a top-level gcc_jit_context:
gcc_jit_context *shared_ctxt;
shared_ctxt = gcc_jit_context_acquire();
/* create types etc within shared_ctxt. */
Then, for each function you want to JIT-compile, create it as a child
context of the top-level context, using
gcc_jit_context_new_child_context:
https://gcc.gnu.org/onlinedocs/jit/topics/contexts.html#gcc_jit_context_new_child_context
Something like this:
gcc_jit_context *fn_ctxt =
gcc_jit_context_new_child_context (shared_ctxt);
/* populate fn_ctxt, creating the function within it. */
/* Compile it. */
gcc_jit_result *fn_result =
gcc_jit_context_compile ();
/* Error handling. */
if (!fn_result) {
do something, querying the error on fn_ctxt.
return;
}
/* You can release the context before releasing
the result. */
gcc_jit_context_release (fn_ctxt);
/* fn_result encapsulates the machine code; it needs to
stick around until you're done calling the
machine code. */
The gcc_jit_result will thus contain just the machine code for the
individual function, and these can be released individually using
gcc_jit_result_release, assuming you can get the GC to run a finalizer
on the function.
Visually you'd have something like this:
* shared_ctxt
* fn_ctxt for "foo"
* fn_result for "foo"
* fn_ctxt for "bar"
* fn_result for "bar"
if that makes sense.
Hope this is helpful
Dave
More information about the Jit
mailing list