參考資訊:
https://github.com/dibyendumajumdar/nanojit
main.cpp
#include <stdio.h>
#include <nanojitextra.h>
static void myfun(void)
{
printf("Hello, world!\n");
}
int main(int argc, char *argv[])
{
int (*pfn)(void);
NJXContextRef jit = NJX_create_context(true);
NJX_register_C_function(jit, "myfun", reinterpret_cast<void *>(myfun), NJXValueKind_V, nullptr, 0);
NJXFunctionBuilderRef builder = NJX_create_function_builder(jit, "test", NJXValueKind_I, nullptr, 0, true);
NJX_callv(builder, "myfun", NJXCallAbiKind::NJX_CALLABI_CDECL, 0, nullptr);
auto zero = NJX_immi(builder, 0);
auto ret = NJX_reti(builder, zero);
pfn = (int (*)(void))NJX_finalize(builder);
NJX_destroy_function_builder(builder);
pfn();
NJX_destroy_context(jit);
return 0;
}
編譯、執行
$ export LD_LIBRARY_PATH=/usr/local/lib
$ g++ main.cpp -o test -I/usr/local/include/nanojit /usr/local/lib/libnanojitextra.so -ggdb
$ ./test
Hello, world!
$ gdb ./test
(gdb) b main.cpp:21
(gdb) r
(gdb) x/20i f
0x7ffff7f7bfa4: push %rbp
0x7ffff7f7bfa5: mov %rsp,%rbp
0x7ffff7f7bfa8: sub $0x30,%rsp
0x7ffff7f7bfac: mov %rbx,-0x28(%rbp)
0x7ffff7f7bfb0: mov %r12,-0x20(%rbp)
0x7ffff7f7bfb4: mov %r13,-0x18(%rbp)
0x7ffff7f7bfb8: mov %r14,-0x10(%rbp)
0x7ffff7f7bfbc: mov %r15,-0x8(%rbp)
0x7ffff7f7bfc0: movabs $0x555555555269,%rax
0x7ffff7f7bfca: call *%rax
0x7ffff7f7bfcc: xor %eax,%eax
0x7ffff7f7bfce: mov %rbp,%rsp
0x7ffff7f7bfd1: pop %rbp
0x7ffff7f7bfd2: ret