@@ -6463,6 +6463,121 @@ static int crec_call_jit_ptr_ptr_u64_ptr_ptr_u32_ptr(jit_State *J,
64636463 return 1 ;
64646464}
64656465
6466+ static int crec_call_jit_ptr_ptr_i32_i32_ptr (jit_State * J , RecordFFData * rd ,
6467+ CTState * cts , CType * ct ,
6468+ CTInfo info , GCcdata * cd ,
6469+ IRType tp , CTSize fsz )
6470+ {
6471+ CType ctrsnap , ctfcopy , dcopy ;
6472+ CType * ctr , * ctf , * d ;
6473+ CTypeID fid , did ;
6474+ CTInfo ctr_info , ctfinfo , dinfo ;
6475+ TRef func , arg0 , arg1 , arg2 , arg3 , tr ;
6476+ MSize narg = 0 ;
6477+
6478+ if ((info & CTF_VARARG ))
6479+ return 0 ;
6480+ while (J -> base [1 + narg ]) {
6481+ if (narg >= 4 )
6482+ return 0 ;
6483+ narg ++ ;
6484+ }
6485+ if (narg != 4 )
6486+ return 0 ;
6487+
6488+ ctr = crec_ctype_rawchild (J , cts , ct , & ctrsnap );
6489+ ctr_info = ctype_info_acq (ctr );
6490+ if (!ctype_isptr (ctr_info ) || ctype_size_acq (ctr ) != CTSIZE_PTR )
6491+ return 0 ;
6492+
6493+ fid = ctype_sib_acq (ct );
6494+ while (fid ) {
6495+ ctf = crec_ctype_snapshot (J , cts , fid , & ctfcopy );
6496+ ctfinfo = ctype_info_acq (ctf );
6497+ if (!ctype_isattrib (ctfinfo )) break ;
6498+ fid = ctype_sib_acq (ctf );
6499+ }
6500+
6501+ if (!fid )
6502+ return 0 ;
6503+ ctf = crec_ctype_snapshot (J , cts , fid , & ctfcopy );
6504+ ctfinfo = ctype_info_acq (ctf );
6505+ if (!ctype_isfield (ctfinfo ))
6506+ return 0 ;
6507+ fid = ctype_sib_acq (ctf );
6508+ did = ctype_cid (ctfinfo );
6509+ d = crec_ctype_rawrefid (J , cts , did , & did , & dcopy );
6510+ dinfo = ctype_info_acq (d );
6511+ if (!ctype_isptr (dinfo ) || ctype_size_acq (d ) != CTSIZE_PTR )
6512+ return 0 ;
6513+ arg0 = crec_ct_tv (J , d , 0 , J -> base [1 ], & rd -> argv [1 ]);
6514+ if (!tref_istype (arg0 , IRT_PTR ))
6515+ lj_trace_err (J , LJ_TRERR_NYICALL );
6516+
6517+ if (!fid )
6518+ return 0 ;
6519+ ctf = crec_ctype_snapshot (J , cts , fid , & ctfcopy );
6520+ ctfinfo = ctype_info_acq (ctf );
6521+ if (!ctype_isfield (ctfinfo ))
6522+ return 0 ;
6523+ fid = ctype_sib_acq (ctf );
6524+ did = ctype_cid (ctfinfo );
6525+ d = crec_ctype_rawrefid (J , cts , did , & did , & dcopy );
6526+ dinfo = ctype_info_acq (d );
6527+ if (!ctype_isinteger (dinfo ) || ctype_size_acq (d ) != 4 ||
6528+ (dinfo & CTF_UNSIGNED ))
6529+ return 0 ;
6530+ arg1 = crec_ct_tv (J , d , 0 , J -> base [2 ], & rd -> argv [2 ]);
6531+ if (!tref_isint (arg1 ))
6532+ lj_trace_err (J , LJ_TRERR_NYICALL );
6533+
6534+ if (!fid )
6535+ return 0 ;
6536+ ctf = crec_ctype_snapshot (J , cts , fid , & ctfcopy );
6537+ ctfinfo = ctype_info_acq (ctf );
6538+ if (!ctype_isfield (ctfinfo ))
6539+ return 0 ;
6540+ fid = ctype_sib_acq (ctf );
6541+ did = ctype_cid (ctfinfo );
6542+ d = crec_ctype_rawrefid (J , cts , did , & did , & dcopy );
6543+ dinfo = ctype_info_acq (d );
6544+ if (!ctype_isinteger (dinfo ) || ctype_size_acq (d ) != 4 ||
6545+ (dinfo & CTF_UNSIGNED ))
6546+ return 0 ;
6547+ arg2 = crec_ct_tv (J , d , 0 , J -> base [3 ], & rd -> argv [3 ]);
6548+ if (!tref_isint (arg2 ))
6549+ lj_trace_err (J , LJ_TRERR_NYICALL );
6550+
6551+ if (!fid )
6552+ return 0 ;
6553+ ctf = crec_ctype_snapshot (J , cts , fid , & ctfcopy );
6554+ ctfinfo = ctype_info_acq (ctf );
6555+ if (!ctype_isfield (ctfinfo ))
6556+ return 0 ;
6557+ fid = ctype_sib_acq (ctf );
6558+ did = ctype_cid (ctfinfo );
6559+ d = crec_ctype_rawrefid (J , cts , did , & did , & dcopy );
6560+ dinfo = ctype_info_acq (d );
6561+ if (!ctype_isptr (dinfo ) || ctype_size_acq (d ) != CTSIZE_PTR )
6562+ return 0 ;
6563+ arg3 = crec_ct_tv (J , d , 0 , J -> base [4 ], & rd -> argv [4 ]);
6564+ if (!tref_istype (arg3 , IRT_PTR ))
6565+ lj_trace_err (J , LJ_TRERR_NYICALL );
6566+ if (fid )
6567+ return 0 ;
6568+
6569+ if (lj_ctype_cb_isblacklisted (cts , cdata_getptr (cdataptr (cd ), fsz )))
6570+ lj_trace_err (J , LJ_TRERR_BLACKL );
6571+
6572+ func = emitir (IRT (IR_FLOAD , tp ), J -> base [0 ], IRFL_CDATA_PTR );
6573+ tr = lj_ir_call (J , IRCALL_lj_ccall_jit_ptr_ptr_i32_i32_ptr ,
6574+ func , arg0 , arg1 , arg2 , arg3 );
6575+ J -> base [0 ] = emitir (IRTG (IR_CNEWI , IRT_CDATA ), lj_ir_kint (J , ctype_cid (info )),
6576+ tr );
6577+ J -> needsnap = 1 ;
6578+ return 1 ;
6579+ }
6580+
64666581static int crec_call_jit_32_ptr_ptr_u64 (jit_State * J , RecordFFData * rd ,
64676582 CTState * cts , CType * ct ,
64686583 CTInfo info , GCcdata * cd ,
@@ -10347,6 +10462,8 @@ static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd)
1034710462 if (crec_call_jit_ptr_ptr_u64_ptr_ptr_u32_ptr (J , rd , cts , ct , info , cd ,
1034810463 tp , fsz ))
1034910464 return 1 ;
10465+ if (crec_call_jit_ptr_ptr_i32_i32_ptr (J , rd , cts , ct , info , cd , tp , fsz ))
10466+ return 1 ;
1035010467 if (crec_call_jit_32_ptr_ptr_u64 (J , rd , cts , ct , info , cd , tp , fsz ))
1035110468 return 1 ;
1035210469 if (crec_call_jit_32_ptr_ptr_u32 (J , rd , cts , ct , info , cd , tp , fsz ))
0 commit comments