From 635371c212a2d344df2aff80506ea51afdd065ef Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 11 Nov 2011 22:10:31 +0100 Subject: FFI: Add unwind definitions for lj_vm_ffi_call. Adds exception interoperability for C/C++ functions called via FFI from the interpreter. --- src/buildvm_asm.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/buildvm_asm.c') diff --git a/src/buildvm_asm.c b/src/buildvm_asm.c index 6a860c9f..01330456 100644 --- a/src/buildvm_asm.c +++ b/src/buildvm_asm.c @@ -202,6 +202,17 @@ void emit_asm(BuildCtx *ctx) for (i = rel = 0; i < ctx->nsym; i++) { int32_t ofs = ctx->sym[i].ofs; int32_t next = ctx->sym[i+1].ofs; +#if LJ_TARGET_ARM && defined(__GNUC__) && !defined(LUAJIT_NO_UNWIND) && \ + LJ_HASFFI + if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call")) + fprintf(ctx->fp, + ".globl lj_err_unwind_arm\n" + ".personality lj_err_unwind_arm\n" + ".fnend\n" + ".fnstart\n" + ".save {r4, r5, r11, lr}\n" + ".setfp r11, sp\n"); +#endif emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1); while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) { BuildReloc *r = &ctx->reloc[rel]; @@ -229,8 +240,10 @@ void emit_asm(BuildCtx *ctx) #if LJ_TARGET_ARM && defined(__GNUC__) && !defined(LUAJIT_NO_UNWIND) fprintf(ctx->fp, +#if !LJ_HASFFI ".globl lj_err_unwind_arm\n" ".personality lj_err_unwind_arm\n" +#endif ".fnend\n"); #endif -- cgit v1.2.3-55-g6feb