From: Petar Jovanovic Date: Tue, 14 Jan 2020 17:45:00 +0000 (+0000) Subject: mips: Implement Iex_CCall for nanoMIPS X-Git-Tag: VALGRIND_3_16_0~138 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b809cdbba8dbb8ae3093bf68653e47dbff7e215;p=thirdparty%2Fvalgrind.git mips: Implement Iex_CCall for nanoMIPS Implement Iex_CCall for nanoMIPS. This fixes none/tests/nestedfns. Patch by Stefan Maksimovic. --- diff --git a/VEX/priv/host_nanomips_isel.c b/VEX/priv/host_nanomips_isel.c index 59adf5868b..d348f21930 100644 --- a/VEX/priv/host_nanomips_isel.c +++ b/VEX/priv/host_nanomips_isel.c @@ -877,8 +877,23 @@ static HReg iselWordExpr_R_wrk(ISelEnv * env, IRExpr * e) } case Iex_CCall: { - /* unimplemented yet */ - vassert(0); + HReg r_dst = newVRegI(env); + UInt addToSp = 0; + RetLoc rloc = mk_RetLoc_INVALID(); + + /* Be very restrictive for now. Only 32-bit ints allowed for + args, and 32 bits for return type. Don't forget to change + the RetLoc if more return types are allowed in future. */ + vassert(Ity_I32 == e->Iex.CCall.retty); + + /* Marshal args, do the call, clear stack. */ + doHelperCall(&rloc, env, NULL /*guard*/, e->Iex.CCall.cee, + e->Iex.CCall.retty, e->Iex.CCall.args); + vassert(is_sane_RetLoc(rloc)); + vassert(rloc.pri == RLPri_Int); + vassert(addToSp == 0); + addInstr(env, mk_iMOVds_RR(r_dst, hregNANOMIPS_GPR4())); + return r_dst; } default: