IRExpr* pyvex_deepCopyIRExpr ( IRExpr* e ) { switch (e->tag) { case Iex_Get: return IRExpr_Get(e->Iex.Get.offset, e->Iex.Get.ty); case Iex_GetI: return IRExpr_GetI(pyvex_deepCopyIRRegArray(e->Iex.GetI.descr), pyvex_deepCopyIRExpr(e->Iex.GetI.ix), e->Iex.GetI.bias); case Iex_RdTmp: return IRExpr_RdTmp(e->Iex.RdTmp.tmp); case Iex_Qop: { IRQop* qop = e->Iex.Qop.details; return IRExpr_Qop(qop->op, pyvex_deepCopyIRExpr(qop->arg1), pyvex_deepCopyIRExpr(qop->arg2), pyvex_deepCopyIRExpr(qop->arg3), pyvex_deepCopyIRExpr(qop->arg4)); } case Iex_Triop: { IRTriop *triop = e->Iex.Triop.details; return IRExpr_Triop(triop->op, pyvex_deepCopyIRExpr(triop->arg1), pyvex_deepCopyIRExpr(triop->arg2), pyvex_deepCopyIRExpr(triop->arg3)); } case Iex_Binop: return IRExpr_Binop(e->Iex.Binop.op, pyvex_deepCopyIRExpr(e->Iex.Binop.arg1), pyvex_deepCopyIRExpr(e->Iex.Binop.arg2)); case Iex_Unop: return IRExpr_Unop(e->Iex.Unop.op, pyvex_deepCopyIRExpr(e->Iex.Unop.arg)); case Iex_Load: return IRExpr_Load(e->Iex.Load.end, e->Iex.Load.ty, pyvex_deepCopyIRExpr(e->Iex.Load.addr)); case Iex_Const: return IRExpr_Const(pyvex_deepCopyIRConst(e->Iex.Const.con)); case Iex_CCall: return IRExpr_CCall(pyvex_deepCopyIRCallee(e->Iex.CCall.cee), e->Iex.CCall.retty, pyvex_deepCopyIRExprVec(e->Iex.CCall.args)); case Iex_ITE: return IRExpr_ITE(pyvex_deepCopyIRExpr(e->Iex.ITE.cond), pyvex_deepCopyIRExpr(e->Iex.ITE.iftrue), pyvex_deepCopyIRExpr(e->Iex.ITE.iffalse)); case Iex_VECRET: return IRExpr_VECRET(); case Iex_BBPTR: return IRExpr_BBPTR(); default: vpanic("pyvex_deepCopyIRExpr"); } }
IRStmt* pyvex_deepCopyIRStmt ( IRStmt* s ) { switch (s->tag) { case Ist_NoOp: return IRStmt_NoOp(); case Ist_AbiHint: return IRStmt_AbiHint(pyvex_deepCopyIRExpr(s->Ist.AbiHint.base), s->Ist.AbiHint.len, pyvex_deepCopyIRExpr(s->Ist.AbiHint.nia)); case Ist_IMark: return IRStmt_IMark(s->Ist.IMark.addr, s->Ist.IMark.len, s->Ist.IMark.delta); case Ist_Put: return IRStmt_Put(s->Ist.Put.offset, pyvex_deepCopyIRExpr(s->Ist.Put.data)); case Ist_PutI: return IRStmt_PutI(pyvex_deepCopyIRPutI(s->Ist.PutI.details)); case Ist_WrTmp: return IRStmt_WrTmp(s->Ist.WrTmp.tmp, pyvex_deepCopyIRExpr(s->Ist.WrTmp.data)); case Ist_Store: return IRStmt_Store(s->Ist.Store.end, pyvex_deepCopyIRExpr(s->Ist.Store.addr), pyvex_deepCopyIRExpr(s->Ist.Store.data)); case Ist_CAS: return IRStmt_CAS(pyvex_deepCopyIRCAS(s->Ist.CAS.details)); case Ist_LLSC: return IRStmt_LLSC(s->Ist.LLSC.end, s->Ist.LLSC.result, pyvex_deepCopyIRExpr(s->Ist.LLSC.addr), s->Ist.LLSC.storedata ? pyvex_deepCopyIRExpr(s->Ist.LLSC.storedata) : NULL); case Ist_Dirty: return IRStmt_Dirty(pyvex_deepCopyIRDirty(s->Ist.Dirty.details)); case Ist_MBE: return IRStmt_MBE(s->Ist.MBE.event); case Ist_Exit: return IRStmt_Exit(pyvex_deepCopyIRExpr(s->Ist.Exit.guard), s->Ist.Exit.jk, pyvex_deepCopyIRConst(s->Ist.Exit.dst), s->Ist.Exit.offsIP); default: vpanic("pyvex_deepCopyIRStmt"); } }