參考資訊:
https://github.com/zherczeg/sljit
https://ftp.netbsd.org/pub/NetBSD/NetBSD-release-10/src/sys/external/bsd/sljit/dist/doc/tutorial/sljit_tutorial.html
main.c
#include <stdio.h>
#include <stdint.h>
#include "sljitLir.h"
int main(int argc, char *argv[])
{
void (*pfn)(void);
const char *msg = "Hello, world!\n";
struct sljit_compiler *c = sljit_create_compiler(NULL);
sljit_compiler_verbose(c, stdout);
sljit_emit_enter(c, 0, SLJIT_ARGS1(W, P), 1, 1, 0);
sljit_emit_op1(c, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)msg);
sljit_emit_icall(c, SLJIT_CALL, SLJIT_ARGS1(W, P), SLJIT_IMM, SLJIT_FUNC_ADDR(printf));
sljit_emit_return(c, SLJIT_MOV, SLJIT_R0, 0);
struct sljit_code *code = sljit_generate_code(c, 0, NULL);
sljit_free_compiler(c);
pfn = (void (*)(void))code;
pfn();
sljit_free_code(code, NULL);
return 0;
}
編譯、執行
$ gcc main.c /opt/sljit/sljit_src/sljitLir.c -o test -I/opt/sljit/sljit_src -ggdb
$ ./test
enter ret[w], args[p], scratches:1, saveds:1, fscratches:0, fsaveds:0, vscratches:0, vsaveds:0, local_size:0
mov r0, #94492020445188
icall ret[w], args[p], #140593066280688
return r0
Hello, world!