aboutsummaryrefslogtreecommitdiff
path: root/src/copyjit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/copyjit.c')
-rw-r--r--src/copyjit.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/copyjit.c b/src/copyjit.c
index 393c8e1..0de85d3 100644
--- a/src/copyjit.c
+++ b/src/copyjit.c
@@ -471,6 +471,23 @@ void compile_start(ctx_t *ctx)
ctx->pc = ctx->buf;
}
+reloc_t compile_placeholder(ctx_t *ctx, compile_callback_t call)
+{
+ reloc_t r = {0};
+ r.addr = call(ctx, 0);
+
+ /* the immediate is the last sizeof(uintptr_t) bytes of the generated
+ * instruction
+ * (at least we assume, the user could've passed anything to our callback) */
+ r.imm = ((uintptr_t *)ctx->pc) - 1;
+ return r;
+}
+
+void compile_patch(reloc_t reloc, void *addr)
+{
+ *reloc.imm = (uintptr_t)addr;
+}
+
void compile_finish(ctx_t *ctx)
{
__builtin___clear_cache(ctx->buf, ctx->buf + ctx->size);