diff --git a/libtcc.c b/libtcc.c index 90450364..5f27d2e4 100644 --- a/libtcc.c +++ b/libtcc.c @@ -881,9 +881,13 @@ LIBTCCAPI TCCState *tcc_new(void) tcc_define_symbol(s, "__linux", NULL); # endif # if defined(__FreeBSD__) - tcc_define_symbol(s, "__FreeBSD__", "__FreeBSD__"); + tcc_define_symbol(s, "__FreeBSD__", "12"); /* No 'Thread Storage Local' on FreeBSD with tcc */ tcc_define_symbol(s, "__NO_TLS", NULL); +# if defined(__aarch64__) + /* FIXME, __int128_t is used by setjump */ + tcc_define_symbol(s, "__int128_t", "struct { unsigned char _dummy[16]; }"); +# endif # endif # if defined(__FreeBSD_kernel__) tcc_define_symbol(s, "__FreeBSD_kernel__", NULL); diff --git a/tccrun.c b/tccrun.c index c965e4e3..724a5494 100644 --- a/tccrun.c +++ b/tccrun.c @@ -678,6 +678,9 @@ static void rt_getcontext(ucontext_t *uc, rt_context *rc) #elif defined(__arm__) rc->ip = uc->uc_mcontext.arm_pc; rc->fp = uc->uc_mcontext.arm_fp; +#elif defined(__aarch64__) && defined(__FreeBSD__) + rc->ip = uc->uc_mcontext.mc_gpregs.gp_elr; /* aka REG_PC */ + rc->fp = uc->uc_mcontext.mc_gpregs.gp_x[29]; #elif defined(__aarch64__) rc->ip = uc->uc_mcontext.pc; rc->fp = uc->uc_mcontext.regs[29];