From ddd0fd8f3754ad83423623655d8b3f8454a7cf1e Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 23 Mar 2021 00:33:34 +0100 Subject: [PATCH] Use weak guards for on-trace allocations. --- src/lj_ffrecord.c | 30 ++++++++++++------------- src/lj_ir.h | 10 ++++----- src/lj_ircall.h | 56 ++++++++++++++++++++++++----------------------- src/lj_record.c | 4 ++-- 4 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index baf7279d..6c7eb2a0 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c @@ -707,7 +707,7 @@ static void LJ_FASTCALL recff_bit_tohex(jit_State *J, RecordFFData *rd) #if LJ_HASFFI TRef hdr = recff_bufhdr(J); TRef tr = recff_bit64_tohex(J, rd, hdr); - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); #else recff_nyiu(J, rd); /* Don't bother working around this NYI. */ #endif @@ -833,8 +833,8 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd) if (i > 1) { /* Concatenate the strings, if there's more than one. */ TRef hdr = recff_bufhdr(J), tr = hdr; for (i = 0; J->base[i] != 0; i++) - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]); - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, J->base[i]); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); } else if (i == 0) { J->base[0] = lj_ir_kstr(J, &J2G(J)->strempty); } @@ -852,19 +852,19 @@ static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd) emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1)); if (vrep > 1) { TRef hdr2 = recff_bufhdr(J); - TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep); - tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str); - str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2); + TRef tr2 = emitir(IRTG(IR_BUFPUT, IRT_PGC), hdr2, sep); + tr2 = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr2, str); + str2 = emitir(IRTG(IR_BUFSTR, IRT_STR), tr2, hdr2); } } tr = hdr = recff_bufhdr(J); if (str2) { - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str); + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, str); str = str2; rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1)); } tr = lj_ir_call(J, IRCALL_lj_buf_putstr_rep, tr, str, rep); - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); } static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd) @@ -872,7 +872,7 @@ static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd) TRef str = lj_ir_tostr(J, J->base[0]); TRef hdr = recff_bufhdr(J); TRef tr = lj_ir_call(J, rd->data, hdr, str); - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); } static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd) @@ -953,7 +953,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd) IRCallID id; switch (STRFMT_TYPE(sf)) { case STRFMT_LIT: - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len))); break; case STRFMT_INT: @@ -962,7 +962,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd) if (!tref_isinteger(tra)) goto handle_num; if (sf == STRFMT_INT) { /* Shortcut for plain %d. */ - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT)); } else { #if LJ_HASFFI @@ -992,7 +992,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd) return; } if (sf == STRFMT_STR) /* Shortcut for plain %s. */ - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra); + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, tra); else if ((sf & STRFMT_T_QUOTED)) tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra); else @@ -1001,7 +1001,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd) case STRFMT_CHAR: tra = lj_opt_narrow_toint(J, tra); if (sf == STRFMT_CHAR) /* Shortcut for plain %c. */ - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR)); else tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra); @@ -1013,7 +1013,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd) return; } } - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); } /* -- Table library fast functions ---------------------------------------- */ @@ -1054,7 +1054,7 @@ static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd) TRef hdr = recff_bufhdr(J); TRef tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre); emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL)); - J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + J->base[0] = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); } /* else: Interpreter will throw. */ UNUSED(rd); } diff --git a/src/lj_ir.h b/src/lj_ir.h index 1aedfd0e..aacef2b4 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h @@ -124,8 +124,8 @@ \ /* Buffer operations. */ \ _(BUFHDR, L , ref, lit) \ - _(BUFPUT, L , ref, ref) \ - _(BUFSTR, A , ref, ref) \ + _(BUFPUT, LW, ref, ref) \ + _(BUFSTR, AW, ref, ref) \ \ /* Barriers. */ \ _(TBAR, S , ref, ___) \ @@ -139,9 +139,9 @@ _(STRTO, N , ref, ___) \ \ /* Calls. */ \ - _(CALLN, N , ref, lit) \ - _(CALLA, A , ref, lit) \ - _(CALLL, L , ref, lit) \ + _(CALLN, NW, ref, lit) \ + _(CALLA, AW, ref, lit) \ + _(CALLL, LW, ref, lit) \ _(CALLS, S , ref, lit) \ _(CALLXS, S , ref, ref) \ _(CARG, N , ref, ref) \ diff --git a/src/lj_ircall.h b/src/lj_ircall.h index d467403e..13501ba1 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h @@ -30,10 +30,12 @@ typedef struct CCallInfo { #define CCI_CALL_L (IR_CALLL << CCI_OPSHIFT) #define CCI_CALL_S (IR_CALLS << CCI_OPSHIFT) #define CCI_CALL_FN (CCI_CALL_N|CCI_CC_FASTCALL) +#define CCI_CALL_FA (CCI_CALL_A|CCI_CC_FASTCALL) #define CCI_CALL_FL (CCI_CALL_L|CCI_CC_FASTCALL) #define CCI_CALL_FS (CCI_CALL_S|CCI_CC_FASTCALL) /* C call info flags. */ +#define CCI_T (IRT_GUARD << CCI_OTSHIFT) /* May throw. */ #define CCI_L 0x0100 /* Implicit L arg. */ #define CCI_CASTU64 0x0200 /* Cast u64 result to number. */ #define CCI_NOFPRCLOBBER 0x0400 /* Does not clobber any FPRs. */ @@ -139,39 +141,39 @@ typedef struct CCallInfo { #define IRCALLDEF(_) \ _(ANY, lj_str_cmp, 2, FN, INT, CCI_NOFPRCLOBBER) \ _(ANY, lj_str_find, 4, N, PGC, 0) \ - _(ANY, lj_str_new, 3, S, STR, CCI_L) \ + _(ANY, lj_str_new, 3, S, STR, CCI_L|CCI_T) \ _(ANY, lj_strscan_num, 2, FN, INT, 0) \ - _(ANY, lj_strfmt_int, 2, FN, STR, CCI_L) \ - _(ANY, lj_strfmt_num, 2, FN, STR, CCI_L) \ - _(ANY, lj_strfmt_char, 2, FN, STR, CCI_L) \ - _(ANY, lj_strfmt_putint, 2, FL, PGC, 0) \ - _(ANY, lj_strfmt_putnum, 2, FL, PGC, 0) \ - _(ANY, lj_strfmt_putquoted, 2, FL, PGC, 0) \ - _(ANY, lj_strfmt_putfxint, 3, L, PGC, XA_64) \ - _(ANY, lj_strfmt_putfnum_int, 3, L, PGC, XA_FP) \ - _(ANY, lj_strfmt_putfnum_uint, 3, L, PGC, XA_FP) \ - _(ANY, lj_strfmt_putfnum, 3, L, PGC, XA_FP) \ - _(ANY, lj_strfmt_putfstr, 3, L, PGC, 0) \ - _(ANY, lj_strfmt_putfchar, 3, L, PGC, 0) \ - _(ANY, lj_buf_putmem, 3, S, PGC, 0) \ - _(ANY, lj_buf_putstr, 2, FL, PGC, 0) \ - _(ANY, lj_buf_putchar, 2, FL, PGC, 0) \ - _(ANY, lj_buf_putstr_reverse, 2, FL, PGC, 0) \ - _(ANY, lj_buf_putstr_lower, 2, FL, PGC, 0) \ - _(ANY, lj_buf_putstr_upper, 2, FL, PGC, 0) \ - _(ANY, lj_buf_putstr_rep, 3, L, PGC, 0) \ - _(ANY, lj_buf_puttab, 5, L, PGC, 0) \ - _(ANY, lj_buf_tostr, 1, FL, STR, 0) \ - _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L) \ - _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \ - _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \ + _(ANY, lj_strfmt_int, 2, FN, STR, CCI_L|CCI_T) \ + _(ANY, lj_strfmt_num, 2, FN, STR, CCI_L|CCI_T) \ + _(ANY, lj_strfmt_char, 2, FN, STR, CCI_L|CCI_T) \ + _(ANY, lj_strfmt_putint, 2, FL, PGC, CCI_T) \ + _(ANY, lj_strfmt_putnum, 2, FL, PGC, CCI_T) \ + _(ANY, lj_strfmt_putquoted, 2, FL, PGC, CCI_T) \ + _(ANY, lj_strfmt_putfxint, 3, L, PGC, XA_64|CCI_T) \ + _(ANY, lj_strfmt_putfnum_int, 3, L, PGC, XA_FP|CCI_T) \ + _(ANY, lj_strfmt_putfnum_uint, 3, L, PGC, XA_FP|CCI_T) \ + _(ANY, lj_strfmt_putfnum, 3, L, PGC, XA_FP|CCI_T) \ + _(ANY, lj_strfmt_putfstr, 3, L, PGC, CCI_T) \ + _(ANY, lj_strfmt_putfchar, 3, L, PGC, CCI_T) \ + _(ANY, lj_buf_putmem, 3, S, PGC, CCI_T) \ + _(ANY, lj_buf_putstr, 2, FL, PGC, CCI_T) \ + _(ANY, lj_buf_putchar, 2, FL, PGC, CCI_T) \ + _(ANY, lj_buf_putstr_reverse, 2, FL, PGC, CCI_T) \ + _(ANY, lj_buf_putstr_lower, 2, FL, PGC, CCI_T) \ + _(ANY, lj_buf_putstr_upper, 2, FL, PGC, CCI_T) \ + _(ANY, lj_buf_putstr_rep, 3, L, PGC, CCI_T) \ + _(ANY, lj_buf_puttab, 5, L, PGC, CCI_T) \ + _(ANY, lj_buf_tostr, 1, FL, STR, CCI_T) \ + _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L|CCI_T) \ + _(ANY, lj_tab_new1, 2, FA, TAB, CCI_L|CCI_T) \ + _(ANY, lj_tab_dup, 2, FA, TAB, CCI_L|CCI_T) \ _(ANY, lj_tab_clear, 1, FS, NIL, 0) \ - _(ANY, lj_tab_newkey, 3, S, PGC, CCI_L) \ + _(ANY, lj_tab_newkey, 3, S, PGC, CCI_L|CCI_T) \ _(ANY, lj_tab_len, 1, FL, INT, 0) \ _(ANY, lj_tab_len_hint, 2, FL, INT, 0) \ _(ANY, lj_gc_step_jit, 2, FS, NIL, CCI_L) \ _(ANY, lj_gc_barrieruv, 2, FS, NIL, 0) \ - _(ANY, lj_mem_newgco, 2, FS, PGC, CCI_L) \ + _(ANY, lj_mem_newgco, 2, FA, PGC, CCI_L|CCI_T) \ _(ANY, lj_prng_u64d, 1, FS, NUM, CCI_CASTU64) \ _(ANY, lj_vm_modi, 2, FN, INT, 0) \ _(ANY, log10, 1, N, NUM, XA_FP) \ diff --git a/src/lj_record.c b/src/lj_record.c index c1adaa74..a4779933 100644 --- a/src/lj_record.c +++ b/src/lj_record.c @@ -1935,9 +1935,9 @@ static TRef rec_cat(jit_State *J, BCReg baseslot, BCReg topslot) tr = hdr = emitir(IRT(IR_BUFHDR, IRT_PGC), lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET); do { - tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, *trp++); + tr = emitir(IRTG(IR_BUFPUT, IRT_PGC), tr, *trp++); } while (trp <= top); - tr = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); + tr = emitir(IRTG(IR_BUFSTR, IRT_STR), tr, hdr); J->maxslot = (BCReg)(xbase - J->base); if (xbase == base) return tr; /* Return simple concatenation result. */ /* Pass partial result. */