IRCAS *vx_dopyIRCAS(IRCAS *cas) { return vx_mkIRCAS(cas->oldHi, cas->oldLo, cas->end, vx_dopyIRExpr(cas->addr), cas->expdHi == NULL ? NULL : vx_dopyIRExpr(cas->expdHi), vx_dopyIRExpr(cas->expdLo), cas->dataHi == NULL ? NULL : vx_dopyIRExpr(cas->dataHi), vx_dopyIRExpr(cas->dataLo)); }
IRCAS* vx_dopyIRCAS ( IRCAS* cas ) { IRCAS* cas2 = vx_emptyIRCAS(); cas2->oldHi = cas->oldHi; cas2->oldLo = cas->oldLo; cas2->end = cas->end; cas2->addr = cas->addr==NULL ? NULL : vx_dopyIRExpr(cas->addr); cas2->expdHi = cas->expdHi==NULL ? NULL : vx_dopyIRExpr(cas->expdHi); cas2->expdLo = cas->expdLo==NULL ? NULL : vx_dopyIRExpr(cas->expdLo); cas2->dataHi = cas->dataHi==NULL ? NULL : vx_dopyIRExpr(cas->dataHi); cas2->dataLo = cas->dataLo==NULL ? NULL : vx_dopyIRExpr(cas->dataLo); return cas2; }
IRDirty* vx_dopyIRDirty ( IRDirty* d ) { Int i; IRDirty* d2 = vx_emptyIRDirty(); d2->cee = vx_dopyIRCallee(d->cee); d2->guard = vx_dopyIRExpr(d->guard); d2->args = vx_dopyIRExprVec(d->args); d2->tmp = d->tmp; d2->mFx = d->mFx; d2->mAddr = d->mAddr==NULL ? NULL : vx_dopyIRExpr(d->mAddr); d2->mSize = d->mSize; d2->needsBBP = d->needsBBP; d2->nFxState = d->nFxState; for (i = 0; i < d2->nFxState; i++) d2->fxState[i] = d->fxState[i]; return d2; }
IRSB* vx_dopyIRSB ( IRSB* bb ) { Int i; IRStmt** sts2; IRSB* bb2 = vx_emptyIRSB(); bb2->tyenv = vx_dopyIRTypeEnv(bb->tyenv); bb2->stmts_used = bb2->stmts_size = bb->stmts_used; sts2 = (IRStmt **)vx_Alloc(bb2->stmts_used * sizeof(IRStmt*)); for (i = 0; i < bb2->stmts_used; i++) sts2[i] = vx_dopyIRStmt(bb->stmts[i]); bb2->stmts = sts2; bb2->next = vx_dopyIRExpr(bb->next); bb2->jumpkind = bb->jumpkind; return bb2; }
IRStmt* vx_dopyIRStmt ( IRStmt* s ) { switch (s->tag) { case Ist_NoOp: return vx_IRStmt_NoOp(); case Ist_AbiHint: return vx_IRStmt_AbiHint(vx_dopyIRExpr(s->Ist.AbiHint.base), s->Ist.AbiHint.len); case Ist_IMark: return vx_IRStmt_IMark(s->Ist.IMark.addr, s->Ist.IMark.len); case Ist_Put: return vx_IRStmt_Put(s->Ist.Put.offset, vx_dopyIRExpr(s->Ist.Put.data)); case Ist_PutI: return vx_IRStmt_PutI(vx_dopyIRRegArray(s->Ist.PutI.descr), vx_dopyIRExpr(s->Ist.PutI.ix), s->Ist.PutI.bias, vx_dopyIRExpr(s->Ist.PutI.data)); case Ist_WrTmp: return vx_IRStmt_Tmp(s->Ist.WrTmp.tmp, vx_dopyIRExpr(s->Ist.WrTmp.data)); case Ist_Store: return vx_IRStmt_Store(s->Ist.Store.end, vx_dopyIRExpr(s->Ist.Store.addr), vx_dopyIRExpr(s->Ist.Store.data)); case Ist_Dirty: return vx_IRStmt_Dirty(vx_dopyIRDirty(s->Ist.Dirty.details)); case Ist_MFence: return vx_IRStmt_MFence(); case Ist_Exit: return vx_IRStmt_Exit(vx_dopyIRExpr(s->Ist.Exit.guard), s->Ist.Exit.jk, vx_dopyIRConst(s->Ist.Exit.dst)); default: vx_panic("vx_dopyIRStmt"); } return NULL; }
IRExpr* vx_dopyIRExpr ( IRExpr* e ) { switch (e->tag) { case Iex_Get: return vx_IRExpr_Get(e->Iex.Get.offset, e->Iex.Get.ty); case Iex_GetI: return vx_IRExpr_GetI(vx_dopyIRRegArray(e->Iex.GetI.descr), vx_dopyIRExpr(e->Iex.GetI.ix), e->Iex.GetI.bias); case Iex_RdTmp: return vx_IRExpr_Tmp(e->Iex.RdTmp.tmp); case Iex_Qop: return vx_IRExpr_Qop(e->Iex.Qop.op, vx_dopyIRExpr(e->Iex.Qop.arg1), vx_dopyIRExpr(e->Iex.Qop.arg2), vx_dopyIRExpr(e->Iex.Qop.arg3), vx_dopyIRExpr(e->Iex.Qop.arg4)); case Iex_Triop: return vx_IRExpr_Triop(e->Iex.Triop.op, vx_dopyIRExpr(e->Iex.Triop.arg1), vx_dopyIRExpr(e->Iex.Triop.arg2), vx_dopyIRExpr(e->Iex.Triop.arg3)); case Iex_Binop: return vx_IRExpr_Binop(e->Iex.Binop.op, vx_dopyIRExpr(e->Iex.Binop.arg1), vx_dopyIRExpr(e->Iex.Binop.arg2)); case Iex_Unop: return vx_IRExpr_Unop(e->Iex.Unop.op, vx_dopyIRExpr(e->Iex.Unop.arg)); case Iex_Load: return vx_IRExpr_Load(e->Iex.Load.end, e->Iex.Load.ty, vx_dopyIRExpr(e->Iex.Load.addr)); case Iex_Const: return vx_IRExpr_Const(vx_dopyIRConst(e->Iex.Const.con)); case Iex_CCall: return vx_IRExpr_CCall(vx_dopyIRCallee(e->Iex.CCall.cee), e->Iex.CCall.retty, vx_dopyIRExprVec(e->Iex.CCall.args)); case Iex_Mux0X: return vx_IRExpr_Mux0X(vx_dopyIRExpr(e->Iex.Mux0X.cond), vx_dopyIRExpr(e->Iex.Mux0X.expr0), vx_dopyIRExpr(e->Iex.Mux0X.exprX)); default: vx_panic("vx_dopyIRExpr"); } return NULL; }
IRStmt *vx_dopyIRStmt(IRStmt *s) { switch (s->tag) { case Ist_NoOp: return vx_IRStmt_NoOp(); case Ist_AbiHint: return vx_IRStmt_AbiHint(vx_dopyIRExpr(s->Ist.AbiHint.base), s->Ist.AbiHint.len); case Ist_IMark: return vx_IRStmt_IMark(s->Ist.IMark.addr, s->Ist.IMark.len); case Ist_Put: return vx_IRStmt_Put(s->Ist.Put.offset, vx_dopyIRExpr(s->Ist.Put.data)); case Ist_PutI: return vx_IRStmt_PutI(vx_dopyIRRegArray(s->Ist.PutI.details->descr), vx_dopyIRExpr(s->Ist.PutI.details->ix), s->Ist.PutI.details->bias, vx_dopyIRExpr(s->Ist.PutI.details->data)); case Ist_WrTmp: return vx_IRStmt_Tmp(s->Ist.WrTmp.tmp, vx_dopyIRExpr(s->Ist.WrTmp.data)); case Ist_Store: return vx_IRStmt_Store(s->Ist.Store.end, vx_dopyIRExpr(s->Ist.Store.addr), vx_dopyIRExpr(s->Ist.Store.data)); case Ist_Dirty: return vx_IRStmt_Dirty(vx_dopyIRDirty(s->Ist.Dirty.details)); case Ist_MFence: return vx_IRStmt_MFence(); case Ist_Exit: return vx_IRStmt_Exit(vx_dopyIRExpr(s->Ist.Exit.guard), s->Ist.Exit.jk, vx_dopyIRConst(s->Ist.Exit.dst)); case Ist_CAS: return vx_IRStmt_CAS(vx_dopyIRCAS(s->Ist.CAS.details)); case Ist_LLSC: return vx_IRStmt_LLSC(s->Ist.LLSC.end, s->Ist.LLSC.result, vx_dopyIRExpr(s->Ist.LLSC.addr), s->Ist.LLSC.storedata ? vx_dopyIRExpr(s->Ist.LLSC.storedata) : NULL); default: _panic("vx_dopyIRStmt(): unknown statement"); } return NULL; }
IRExpr *vx_dopyIRExpr(IRExpr *e) { switch (e->tag) { case Iex_Get: return vx_IRExpr_Get(e->Iex.Get.offset, e->Iex.Get.ty); case Iex_GetI: return vx_IRExpr_GetI(vx_dopyIRRegArray(e->Iex.GetI.descr), vx_dopyIRExpr(e->Iex.GetI.ix), e->Iex.GetI.bias); case Iex_RdTmp: return vx_IRExpr_Tmp(e->Iex.RdTmp.tmp); case Iex_Qop: return vx_IRExpr_Qop(e->Iex.Qop.details->op, vx_dopyIRExpr(e->Iex.Qop.details->arg1), vx_dopyIRExpr(e->Iex.Qop.details->arg2), vx_dopyIRExpr(e->Iex.Qop.details->arg3), vx_dopyIRExpr(e->Iex.Qop.details->arg4)); case Iex_Triop: return vx_IRExpr_Triop(e->Iex.Triop.details->op, vx_dopyIRExpr(e->Iex.Triop.details->arg1), vx_dopyIRExpr(e->Iex.Triop.details->arg2), vx_dopyIRExpr(e->Iex.Triop.details->arg3)); case Iex_Binop: return vx_IRExpr_Binop(e->Iex.Binop.op, vx_dopyIRExpr(e->Iex.Binop.arg1), vx_dopyIRExpr(e->Iex.Binop.arg2)); case Iex_Unop: return vx_IRExpr_Unop(e->Iex.Unop.op, vx_dopyIRExpr(e->Iex.Unop.arg)); case Iex_Load: return vx_IRExpr_Load(e->Iex.Load.end, e->Iex.Load.ty, vx_dopyIRExpr(e->Iex.Load.addr)); case Iex_Const: return vx_IRExpr_Const(vx_dopyIRConst(e->Iex.Const.con)); case Iex_CCall: return vx_IRExpr_CCall(vx_dopyIRCallee(e->Iex.CCall.cee), e->Iex.CCall.retty, vx_dopyIRExprVec(e->Iex.CCall.args)); case Iex_ITE: return vx_IRExpr_ITE(vx_dopyIRExpr(e->Iex.ITE.cond), vx_dopyIRExpr(e->Iex.ITE.iftrue), vx_dopyIRExpr(e->Iex.ITE.iffalse)); case Iex_BBPTR: return vx_IRExpr_BBPTR(); case Iex_Binder: _panic("vx_dopyIRExpr(): case Iex_Binder (this should not be seen outside VEX)"); default: _panic("vx_dopyIRExpr(): unknown expression"); } return NULL; }
IRStmt* vx_dopyIRStmt ( IRStmt* s ) { switch (s->tag) { case Ist_NoOp: return vx_IRStmt_NoOp(); case Ist_AbiHint: return vx_IRStmt_AbiHint(vx_dopyIRExpr(s->Ist.AbiHint.base), s->Ist.AbiHint.len, #if VEX_VERSION >= 1832 s->Ist.AbiHint.nia #else 0 #endif ); case Ist_IMark: return vx_IRStmt_IMark(s->Ist.IMark.addr, s->Ist.IMark.len, #if VEX_VERSION >= 2153 s->Ist.IMark.delta #else 0 #endif ); case Ist_Put: return vx_IRStmt_Put(s->Ist.Put.offset, vx_dopyIRExpr(s->Ist.Put.data)); case Ist_PutI: #if VEX_VERSION < 2361 return vx_IRStmt_PutI(vx_dopyIRRegArray(s->Ist.PutI.descr), vx_dopyIRExpr(s->Ist.PutI.ix), s->Ist.PutI.bias, vx_dopyIRExpr(s->Ist.PutI.data)); #else return vx_IRStmt_PutI(vx_dopyIRRegArray(s->Ist.PutI.details->descr), vx_dopyIRExpr(s->Ist.PutI.details->ix), s->Ist.PutI.details->bias, vx_dopyIRExpr(s->Ist.PutI.details->data)); #endif case Ist_WrTmp: return vx_IRStmt_Tmp(s->Ist.WrTmp.tmp, vx_dopyIRExpr(s->Ist.WrTmp.data)); case Ist_Store: return vx_IRStmt_Store(s->Ist.Store.end, vx_dopyIRExpr(s->Ist.Store.addr), vx_dopyIRExpr(s->Ist.Store.data)); case Ist_Dirty: return vx_IRStmt_Dirty(vx_dopyIRDirty(s->Ist.Dirty.details)); #if LIBASMIR_VEX_VERSION < 1793 case Ist_MFence: return vx_IRStmt_MFence(); #else case Ist_MBE: return vx_IRStmt_MBE(s->Ist.MBE.event); #endif case Ist_Exit: return vx_IRStmt_Exit(vx_dopyIRExpr(s->Ist.Exit.guard), s->Ist.Exit.jk, vx_dopyIRConst(s->Ist.Exit.dst)); #if VEX_VERSION >= 1901 case Ist_CAS: return vx_IRStmt_CAS(vx_dopyIRCAS(s->Ist.CAS.details)); #endif #if VEX_VERSION >= 1930 case Ist_LLSC: { IRExpr* addr = s->Ist.LLSC.addr; IRExpr* addr2 = addr ? vx_dopyIRExpr(addr) : NULL; IRExpr* storedata = s->Ist.LLSC.storedata; IRExpr* storedata2 = storedata ? vx_dopyIRExpr(storedata) : NULL; return vx_IRStmt_LLSC(s->Ist.LLSC.end, s->Ist.LLSC.result, addr2, storedata2); } #endif #if VEX_VERSION >= 2642 case Ist_StoreG: { const IRStoreG* sg = s->Ist.StoreG.details; return vx_IRStmt_StoreG(sg->end, vx_dopyIRExpr(sg->addr), vx_dopyIRExpr(sg->data), vx_dopyIRExpr(sg->guard)); } case Ist_LoadG: { const IRLoadG* lg = s->Ist.LoadG.details; return vx_IRStmt_LoadG(lg->end, lg->cvt, lg->dst, vx_dopyIRExpr(lg->addr), vx_dopyIRExpr(lg->alt), vx_dopyIRExpr(lg->guard)); } #endif default: vx_panic("vx_dopyIRStmt"); } return NULL; }
IRExpr* vx_dopyIRExpr ( IRExpr* e ) { switch (e->tag) { case Iex_Get: return vx_IRExpr_Get(e->Iex.Get.offset, e->Iex.Get.ty); case Iex_GetI: return vx_IRExpr_GetI(vx_dopyIRRegArray(e->Iex.GetI.descr), vx_dopyIRExpr(e->Iex.GetI.ix), e->Iex.GetI.bias); case Iex_RdTmp: return vx_IRExpr_Tmp(e->Iex.RdTmp.tmp); case Iex_Qop: #if VEX_VERSION < 2363 return vx_IRExpr_Qop(e->Iex.Qop.op, vx_dopyIRExpr(e->Iex.Qop.arg1), vx_dopyIRExpr(e->Iex.Qop.arg2), vx_dopyIRExpr(e->Iex.Qop.arg3), vx_dopyIRExpr(e->Iex.Qop.arg4)); #else return vx_IRExpr_Qop(e->Iex.Qop.details->op, vx_dopyIRExpr(e->Iex.Qop.details->arg1), vx_dopyIRExpr(e->Iex.Qop.details->arg2), vx_dopyIRExpr(e->Iex.Qop.details->arg3), vx_dopyIRExpr(e->Iex.Qop.details->arg4)); #endif case Iex_Triop: #if VEX_VERSION < 2366 return vx_IRExpr_Triop(e->Iex.Triop.op, vx_dopyIRExpr(e->Iex.Triop.arg1), vx_dopyIRExpr(e->Iex.Triop.arg2), vx_dopyIRExpr(e->Iex.Triop.arg3)); #else return vx_IRExpr_Triop(e->Iex.Triop.details->op, vx_dopyIRExpr(e->Iex.Triop.details->arg1), vx_dopyIRExpr(e->Iex.Triop.details->arg2), vx_dopyIRExpr(e->Iex.Triop.details->arg3)); #endif case Iex_Binop: return vx_IRExpr_Binop(e->Iex.Binop.op, vx_dopyIRExpr(e->Iex.Binop.arg1), vx_dopyIRExpr(e->Iex.Binop.arg2)); case Iex_Unop: return vx_IRExpr_Unop(e->Iex.Unop.op, vx_dopyIRExpr(e->Iex.Unop.arg)); case Iex_Load: return vx_IRExpr_Load(e->Iex.Load.end, e->Iex.Load.ty, vx_dopyIRExpr(e->Iex.Load.addr)); case Iex_Const: return vx_IRExpr_Const(vx_dopyIRConst(e->Iex.Const.con)); case Iex_CCall: return vx_IRExpr_CCall(vx_dopyIRCallee(e->Iex.CCall.cee), e->Iex.CCall.retty, vx_dopyIRExprVec(e->Iex.CCall.args)); #if VEX_VERSION < 2668 case Iex_Mux0X: return vx_IRExpr_Mux0X(vx_dopyIRExpr(e->Iex.Mux0X.cond), vx_dopyIRExpr(e->Iex.Mux0X.expr0), vx_dopyIRExpr(e->Iex.Mux0X.exprX)); #else case Iex_ITE: return vx_IRExpr_ITE(vx_dopyIRExpr(e->Iex.ITE.cond), vx_dopyIRExpr(e->Iex.ITE.iftrue), vx_dopyIRExpr(e->Iex.ITE.iffalse)); #endif #if VEX_VERSION >= 2742 case Iex_VECRET: return vx_IRExpr_VECRET(); case Iex_BBPTR: return vx_IRExpr_BBPTR(); #endif default: vx_panic("Unhandled type in vx_dopyIRExpr"); } return NULL; }