📄 irdefs.c
字号:
return IRExpr_Mux0X(dopyIRExpr(e->Iex.Mux0X.cond), dopyIRExpr(e->Iex.Mux0X.expr0), dopyIRExpr(e->Iex.Mux0X.exprX)); default: vpanic("dopyIRExpr"); }}IRDirty* dopyIRDirty ( IRDirty* d ){ Int i; IRDirty* d2 = emptyIRDirty(); d2->cee = dopyIRCallee(d->cee); d2->guard = dopyIRExpr(d->guard); d2->args = dopyIRExprVec(d->args); d2->tmp = d->tmp; d2->mFx = d->mFx; d2->mAddr = d->mAddr==NULL ? NULL : 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;}IRStmt* dopyIRStmt ( IRStmt* s ){ switch (s->tag) { case Ist_NoOp: return IRStmt_NoOp(); case Ist_AbiHint: return IRStmt_AbiHint(dopyIRExpr(s->Ist.AbiHint.base), s->Ist.AbiHint.len); case Ist_IMark: return IRStmt_IMark(s->Ist.IMark.addr, s->Ist.IMark.len); case Ist_Put: return IRStmt_Put(s->Ist.Put.offset, dopyIRExpr(s->Ist.Put.data)); case Ist_PutI: return IRStmt_PutI(dopyIRArray(s->Ist.PutI.descr), dopyIRExpr(s->Ist.PutI.ix), s->Ist.PutI.bias, dopyIRExpr(s->Ist.PutI.data)); case Ist_Tmp: return IRStmt_Tmp(s->Ist.Tmp.tmp, dopyIRExpr(s->Ist.Tmp.data)); case Ist_Store: return IRStmt_Store(s->Ist.Store.end, dopyIRExpr(s->Ist.Store.addr), dopyIRExpr(s->Ist.Store.data)); case Ist_Dirty: return IRStmt_Dirty(dopyIRDirty(s->Ist.Dirty.details)); case Ist_MFence: return IRStmt_MFence(); case Ist_Exit: return IRStmt_Exit(dopyIRExpr(s->Ist.Exit.guard), s->Ist.Exit.jk, dopyIRConst(s->Ist.Exit.dst)); default: vpanic("dopyIRStmt"); }}IRTypeEnv* dopyIRTypeEnv ( IRTypeEnv* src ){ Int i; IRTypeEnv* dst = LibVEX_Alloc(sizeof(IRTypeEnv)); dst->types_size = src->types_size; dst->types_used = src->types_used; dst->types = LibVEX_Alloc(dst->types_size * sizeof(IRType)); for (i = 0; i < src->types_used; i++) dst->types[i] = src->types[i]; return dst;}IRBB* dopyIRBB ( IRBB* bb ){ Int i; IRStmt** sts2; IRBB* bb2 = emptyIRBB(); bb2->tyenv = dopyIRTypeEnv(bb->tyenv); bb2->stmts_used = bb2->stmts_size = bb->stmts_used; sts2 = LibVEX_Alloc(bb2->stmts_used * sizeof(IRStmt*)); for (i = 0; i < bb2->stmts_used; i++) sts2[i] = dopyIRStmt(bb->stmts[i]); bb2->stmts = sts2; bb2->next = dopyIRExpr(bb->next); bb2->jumpkind = bb->jumpkind; return bb2;}/*---------------------------------------------------------------*//*--- Primop types ---*//*---------------------------------------------------------------*/staticvoid typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 ){# define UNARY(_td,_ta1) \ *t_dst = (_td); *t_arg1 = (_ta1); break# define BINARY(_td,_ta1,_ta2) \ *t_dst = (_td); *t_arg1 = (_ta1); *t_arg2 = (_ta2); break# define COMPARISON(_ta) \ *t_dst = Ity_I1; *t_arg1 = *t_arg2 = (_ta); break;# define UNARY_COMPARISON(_ta) \ *t_dst = Ity_I1; *t_arg1 = (_ta); break; *t_dst = Ity_INVALID; *t_arg1 = Ity_INVALID; *t_arg2 = Ity_INVALID; switch (op) { case Iop_Add8: case Iop_Sub8: case Iop_Mul8: case Iop_Or8: case Iop_And8: case Iop_Xor8: BINARY(Ity_I8, Ity_I8,Ity_I8); case Iop_Add16: case Iop_Sub16: case Iop_Mul16: case Iop_Or16: case Iop_And16: case Iop_Xor16: BINARY(Ity_I16, Ity_I16,Ity_I16); case Iop_CmpORD32U: case Iop_CmpORD32S: case Iop_Add32: case Iop_Sub32: case Iop_Mul32: case Iop_Or32: case Iop_And32: case Iop_Xor32: BINARY(Ity_I32, Ity_I32,Ity_I32); case Iop_Add64: case Iop_Sub64: case Iop_Mul64: case Iop_Or64: case Iop_And64: case Iop_Xor64: case Iop_Avg8Ux8: case Iop_Avg16Ux4: case Iop_Add8x8: case Iop_Add16x4: case Iop_Add32x2: case Iop_CmpEQ8x8: case Iop_CmpEQ16x4: case Iop_CmpEQ32x2: case Iop_CmpGT8Sx8: case Iop_CmpGT16Sx4: case Iop_CmpGT32Sx2: case Iop_InterleaveHI8x8: case Iop_InterleaveLO8x8: case Iop_InterleaveHI16x4: case Iop_InterleaveLO16x4: case Iop_InterleaveHI32x2: case Iop_InterleaveLO32x2: case Iop_Max8Ux8: case Iop_Max16Sx4: case Iop_Min8Ux8: case Iop_Min16Sx4: case Iop_Mul16x4: case Iop_MulHi16Sx4: case Iop_MulHi16Ux4: case Iop_QAdd8Sx8: case Iop_QAdd16Sx4: case Iop_QAdd8Ux8: case Iop_QAdd16Ux4: case Iop_QNarrow32Sx2: case Iop_QNarrow16Sx4: case Iop_QNarrow16Ux4: case Iop_Sub8x8: case Iop_Sub16x4: case Iop_Sub32x2: case Iop_QSub8Sx8: case Iop_QSub16Sx4: case Iop_QSub8Ux8: case Iop_QSub16Ux4: BINARY(Ity_I64, Ity_I64,Ity_I64); case Iop_ShlN32x2: case Iop_ShlN16x4: case Iop_ShrN32x2: case Iop_ShrN16x4: case Iop_SarN32x2: case Iop_SarN16x4: BINARY(Ity_I64, Ity_I64,Ity_I8); case Iop_Shl8: case Iop_Shr8: case Iop_Sar8: BINARY(Ity_I8, Ity_I8,Ity_I8); case Iop_Shl16: case Iop_Shr16: case Iop_Sar16: BINARY(Ity_I16, Ity_I16,Ity_I8); case Iop_Shl32: case Iop_Shr32: case Iop_Sar32: BINARY(Ity_I32, Ity_I32,Ity_I8); case Iop_Shl64: case Iop_Shr64: case Iop_Sar64: BINARY(Ity_I64, Ity_I64,Ity_I8); case Iop_Not8: case Iop_Neg8: UNARY(Ity_I8,Ity_I8); case Iop_Not16: case Iop_Neg16: UNARY(Ity_I16,Ity_I16); case Iop_Not32: case Iop_Neg32: UNARY(Ity_I32,Ity_I32); case Iop_Neg64: case Iop_Not64: case Iop_CmpNEZ32x2: case Iop_CmpNEZ16x4: case Iop_CmpNEZ8x8: UNARY(Ity_I64,Ity_I64); case Iop_CmpEQ8: case Iop_CmpNE8: COMPARISON(Ity_I8); case Iop_CmpEQ16: case Iop_CmpNE16: COMPARISON(Ity_I16); case Iop_CmpEQ32: case Iop_CmpNE32: case Iop_CmpLT32S: case Iop_CmpLE32S: case Iop_CmpLT32U: case Iop_CmpLE32U: COMPARISON(Ity_I32); case Iop_CmpEQ64: case Iop_CmpNE64: case Iop_CmpLT64S: case Iop_CmpLE64S: case Iop_CmpLT64U: case Iop_CmpLE64U: COMPARISON(Ity_I64); case Iop_CmpNEZ8: UNARY_COMPARISON(Ity_I8); case Iop_CmpNEZ16: UNARY_COMPARISON(Ity_I16); case Iop_CmpNEZ32: UNARY_COMPARISON(Ity_I32); case Iop_CmpNEZ64: UNARY_COMPARISON(Ity_I64); case Iop_MullU8: case Iop_MullS8: BINARY(Ity_I16, Ity_I8,Ity_I8); case Iop_MullU16: case Iop_MullS16: BINARY(Ity_I32, Ity_I16,Ity_I16); case Iop_MullU32: case Iop_MullS32: BINARY(Ity_I64, Ity_I32,Ity_I32); case Iop_MullU64: case Iop_MullS64: BINARY(Ity_I128, Ity_I64,Ity_I64); case Iop_Clz32: case Iop_Ctz32: UNARY(Ity_I32,Ity_I32); case Iop_Clz64: case Iop_Ctz64: UNARY(Ity_I64,Ity_I64); case Iop_DivU32: case Iop_DivS32: BINARY(Ity_I32, Ity_I32,Ity_I32); case Iop_DivModU64to32: case Iop_DivModS64to32: BINARY(Ity_I64, Ity_I64,Ity_I32); case Iop_DivModU128to64: case Iop_DivModS128to64: BINARY(Ity_I128, Ity_I128,Ity_I64); case Iop_16HIto8: case Iop_16to8: UNARY(Ity_I8,Ity_I16); case Iop_8HLto16: BINARY(Ity_I16, Ity_I8,Ity_I8); case Iop_32HIto16: case Iop_32to16: UNARY(Ity_I16,Ity_I32); case Iop_16HLto32: BINARY(Ity_I32, Ity_I16,Ity_I16); case Iop_64HIto32: case Iop_64to32: UNARY(Ity_I32, Ity_I64); case Iop_32HLto64: BINARY(Ity_I64, Ity_I32,Ity_I32); case Iop_128HIto64: case Iop_128to64: UNARY(Ity_I64, Ity_I128); case Iop_64HLto128: BINARY(Ity_I128, Ity_I64,Ity_I64); case Iop_Not1: UNARY(Ity_I1,Ity_I1); case Iop_1Uto8: UNARY(Ity_I8,Ity_I1); case Iop_1Sto8: UNARY(Ity_I8,Ity_I1); case Iop_1Sto16: UNARY(Ity_I16,Ity_I1); case Iop_1Uto32: case Iop_1Sto32: UNARY(Ity_I32,Ity_I1); case Iop_1Sto64: case Iop_1Uto64: UNARY(Ity_I64,Ity_I1); case Iop_32to1: UNARY(Ity_I1,Ity_I32); case Iop_64to1: UNARY(Ity_I1,Ity_I64); case Iop_8Uto32: case Iop_8Sto32: UNARY(Ity_I32,Ity_I8); case Iop_8Uto16: case Iop_8Sto16: UNARY(Ity_I16,Ity_I8); case Iop_16Uto32: case Iop_16Sto32: UNARY(Ity_I32,Ity_I16); case Iop_32Sto64: case Iop_32Uto64: UNARY(Ity_I64,Ity_I32); case Iop_8Uto64: case Iop_8Sto64: UNARY(Ity_I64,Ity_I8); case Iop_16Uto64: case Iop_16Sto64: UNARY(Ity_I64,Ity_I16); case Iop_64to16: UNARY(Ity_I16, Ity_I64); case Iop_32to8: UNARY(Ity_I8,Ity_I32); case Iop_64to8: UNARY(Ity_I8,Ity_I64); case Iop_ScaleF64: case Iop_PRemF64: case Iop_PRem1F64: case Iop_AtanF64: case Iop_Yl2xF64: case Iop_Yl2xp1F64: case Iop_AddF64: case Iop_SubF64: case Iop_MulF64: case Iop_DivF64: BINARY(Ity_F64,Ity_F64,Ity_F64); case Iop_PRemC3210F64: case Iop_PRem1C3210F64: case Iop_CmpF64: BINARY(Ity_I32,Ity_F64,Ity_F64); case Iop_NegF64: case Iop_AbsF64: case Iop_SqrtF64: case Iop_SinF64: case Iop_CosF64: case Iop_TanF64: case Iop_2xm1F64: UNARY(Ity_F64,Ity_F64); case Iop_ReinterpI64asF64: UNARY(Ity_F64, Ity_I64); case Iop_ReinterpF64asI64: UNARY(Ity_I64, Ity_F64); case Iop_ReinterpI32asF32: UNARY(Ity_F32, Ity_I32); case Iop_ReinterpF32asI32: UNARY(Ity_I32, Ity_F32); case Iop_F64toI16: BINARY(Ity_I16, Ity_I32,Ity_F64); case Iop_F64toI32: BINARY(Ity_I32, Ity_I32,Ity_F64); case Iop_F64toI64: BINARY(Ity_I64, Ity_I32,Ity_F64); case Iop_I16toF64: UNARY(Ity_F64, Ity_I16); case Iop_I32toF64: UNARY(Ity_F64, Ity_I32); case Iop_I64toF64: BINARY(Ity_F64, Ity_I32,Ity_I64); case Iop_F32toF64: UNARY(Ity_F64, Ity_F32); case Iop_F64toF32: BINARY(Ity_F32, Ity_I32,Ity_F64); case Iop_RoundF64: BINARY(Ity_F64, Ity_I32,Ity_F64); case Iop_64HLtoV128: BINARY(Ity_V128, Ity_I64,Ity_I64); case Iop_V128to64: case Iop_V128HIto64: UNARY(Ity_I64, Ity_V128); case Iop_V128to32: UNARY(Ity_I32, Ity_V128); case Iop_32UtoV128: UNARY(Ity_V128, Ity_I32); case Iop_64UtoV128: UNARY(Ity_V128, Ity_I64); case Iop_SetV128lo32: BINARY(Ity_V128, Ity_V128,Ity_I32); case Iop_SetV128lo64: BINARY(Ity_V128, Ity_V128,Ity_I64); case Iop_CmpEQ32Fx4: case Iop_CmpLT32Fx4: case Iop_CmpEQ64Fx2: case Iop_CmpLT64Fx2: case Iop_CmpLE32Fx4: case Iop_CmpUN32Fx4: case Iop_CmpLE64Fx2: case Iop_CmpUN64Fx2: case Iop_CmpEQ32F0x4: case Iop_CmpLT32F0x4: case Iop_CmpEQ64F0x2: case Iop_CmpLT64F0x2: case Iop_CmpLE32F0x4: case Iop_CmpUN32F0x4: case Iop_CmpLE64F0x2: case Iop_CmpUN64F0x2: case Iop_Add32Fx4: case Iop_Add32F0x4: case Iop_Add64Fx2: case Iop_Add64F0x2: case Iop_Div32Fx4: case Iop_Div32F0x4: case Iop_Div64Fx2: case Iop_Div64F0x2: case Iop_Max32Fx4: case Iop_Max32F0x4: case Iop_Max64Fx2: case Iop_Max64F0x2: case Iop_Min32Fx4: case Iop_Min32F0x4: case Iop_Min64Fx2: case Iop_Min64F0x2: case Iop_Mul32Fx4: case Iop_Mul32F0x4: case Iop_Mul64Fx2: case Iop_Mul64F0x2: case Iop_Sub32Fx4: case Iop_Sub32F0x4: case Iop_Sub64Fx2: case Iop_Sub64F0x2: case Iop_AndV128: case Iop_OrV128: case Iop_XorV128: case Iop_Add8x16: case Iop_Add16x8: case Iop_Add32x4: case Iop_Add64x2: case Iop_QAdd8Ux16: case Iop_QAdd16Ux8: case Iop_QAdd8Sx16: case Iop_QAdd16Sx8: case Iop_Sub8x16: case Iop_Sub16x8: case Iop_Sub32x4: case Iop_Sub64x2: case Iop_QSub8Ux16: case Iop_QSub16Ux8: case Iop_QSub8Sx16: case Iop_QSub16Sx8: case Iop_Mul16x8: case Iop_MulHi16Ux8: case Iop_MulHi16Sx8: case Iop_Avg8Ux16: case Iop_Avg16Ux8: case Iop_Max16Sx8: case Iop_Max8Ux16: case Iop_Min16Sx8: case Iop_Min8Ux16: case Iop_CmpEQ8x16: case Iop_CmpEQ16x8: case Iop_CmpEQ32x4: case Iop_CmpGT8Sx16: case Iop_CmpGT16Sx8: case Iop_CmpGT32Sx4: case Iop_QNarrow16Ux8: case Iop_QNarrow16Sx8: case Iop_QNarrow32Sx4: case Iop_InterleaveHI8x16: case Iop_InterleaveHI16x8: case Iop_InterleaveHI32x4: case Iop_InterleaveHI64x2: case Iop_InterleaveLO8x16: case Iop_InterleaveLO16x8: case Iop_InterleaveLO32x4: case Iop_InterleaveLO64x2: BINARY(Ity_V128, Ity_V128,Ity_V128); case Iop_NotV128: case Iop_Recip32Fx4: case Iop_Recip32F0x4: case Iop_Recip64Fx2: case Iop_Recip64F0x2: case Iop_RSqrt32Fx4: case Iop_RSqrt32F0x4: case Iop_RSqrt64Fx2: case Iop_RSqrt64F0x2: case Iop_Sqrt32Fx4: case Iop_Sqrt32F0x4: case Iop_Sqrt64Fx2: case Iop_Sqrt64F0x2: case Iop_CmpNEZ8x16: case Iop_CmpNEZ16x8: case Iop_CmpNEZ32x4: case Iop_CmpNEZ64x2: UNARY(Ity_V128, Ity_V128); case Iop_ShlN16x8: case Iop_ShlN32x4: case Iop_ShlN64x2: case Iop_ShrN16x8: case Iop_ShrN32x4: case Iop_ShrN64x2: case Iop_SarN16x8: case Iop_SarN32x4: BINARY(Ity_V128, Ity_V128, Ity_I8); default: ppIROp(op); vpanic("typeOfPrimop"); }# undef UNARY# undef BINARY# undef COMPARISON# undef UNARY_COMPARISON}/*---------------------------------------------------------------*//*--- Helper functions for the IR -- IR Basic Blocks ---*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -