From: Julian Seward Date: Mon, 7 Sep 2015 13:06:59 +0000 (+0000) Subject: iselStmt, case Ist_Exit: handle the same assisted transfer cases that X-Git-Tag: svn/VALGRIND_3_11_0^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=600e95eefa605e469cef9f8c2f4d72c4fea08f3c;p=thirdparty%2Fvalgrind.git iselStmt, case Ist_Exit: handle the same assisted transfer cases that iselNext does. Fixes #352320. git-svn-id: svn://svn.valgrind.org/vex/trunk@3185 --- diff --git a/VEX/priv/host_arm64_isel.c b/VEX/priv/host_arm64_isel.c index a3e55eba72..a57240891e 100644 --- a/VEX/priv/host_arm64_isel.c +++ b/VEX/priv/host_arm64_isel.c @@ -3870,9 +3870,7 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) = mk_baseblock_64bit_access_amode(stmt->Ist.Exit.offsIP); /* Case: boring transfer to known address */ - if (stmt->Ist.Exit.jk == Ijk_Boring - /*ATC || stmt->Ist.Exit.jk == Ijk_Call */ - /*ATC || stmt->Ist.Exit.jk == Ijk_Ret */ ) { + if (stmt->Ist.Exit.jk == Ijk_Boring) { if (env->chainingAllowed) { /* .. almost always true .. */ /* Skip the event check at the dst if this is a forwards @@ -3892,6 +3890,26 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) return; } + /* Case: assisted transfer to arbitrary address */ + switch (stmt->Ist.Exit.jk) { + /* Keep this list in sync with that for iselNext below */ + case Ijk_ClientReq: + case Ijk_NoDecode: + case Ijk_NoRedir: + case Ijk_Sys_syscall: + case Ijk_InvalICache: + case Ijk_FlushDCache: + case Ijk_SigTRAP: + case Ijk_Yield: { + HReg r = iselIntExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst)); + addInstr(env, ARM64Instr_XAssisted(r, amPC, cc, + stmt->Ist.Exit.jk)); + return; + } + default: + break; + } + /* Do we ever expect to see any other kind? */ goto stmt_fail; }