As part of my ‘community bonding’ period, I’ve taken it upon me to write a small series of blog posts explaining the various parts I’ll be using to add a JIT compiler to MoarVM. Today I’d like to focus on the DynASM project that originates from the awesome LuaJIT project.
DynASM is probably best described as an run-time assembler in two
parts. One part is written in lua and acts as a source
preprocessor. It takes a C source file in which special directives are
placed that take the form of assembly-language statements. Here is a
fully worked-out example. These are then transformed into run-time
calls that construct the desired bytecode. The generated bytecode can
be called like you would a regular function pointer.
DynASM has no run-time dependencies. But to run the preprocessor
you will need lua as well as
the Lua BitOp module (also from
the luajit project). The run-time part is contained within the
headers. DynASM is licensed under the MIT license and supports many
different architectures, including x86, x64, ppc, and arm. DynASM also intergrates neatly into a Makefile-based build.
In many respects DynASM is an ideal tool for this particular
job. However, it also has a few drawbacks. The most important of
these is the lack of documentation. With the exception of a few
scattered blog posts , there is barely any documentation at
all. For many of the simple operations, this is sufficient. For the
more complex things, such as dynamic register selection, or dynamic
labels, it seems there is no other option than to ask
directly. (FWIW, the 'dynamic registers' question was asked an
answered only two days ago on the luajit mailing list). However, I think the benefits of using DynASM outwheigh these issues.
For my next blog, I'll be looking at the MoarVM machine model and bytecode set, especially in relation to x64. Hope to see you then.