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; }
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; }