📄 irdefs.c
字号:
default: vpanic("ppIRJumpKind"); }}void ppIRStmt ( IRStmt* s ){ if (!s) { vex_printf("!!! IRStmt* which is NULL !!!"); return; } switch (s->tag) { case Ist_NoOp: vex_printf("IR-NoOp"); break; case Ist_IMark: vex_printf( "------ IMark(0x%llx, %d) ------", s->Ist.IMark.addr, s->Ist.IMark.len); break; case Ist_AbiHint: vex_printf("====== AbiHint("); ppIRExpr(s->Ist.AbiHint.base); vex_printf(", %d) ======", s->Ist.AbiHint.len); break; case Ist_Put: vex_printf( "PUT(%d) = ", s->Ist.Put.offset); ppIRExpr(s->Ist.Put.data); break; case Ist_PutI: vex_printf( "PUTI" ); ppIRArray(s->Ist.PutI.descr); vex_printf("["); ppIRExpr(s->Ist.PutI.ix); vex_printf(",%d] = ", s->Ist.PutI.bias); ppIRExpr(s->Ist.PutI.data); break; case Ist_Tmp: ppIRTemp(s->Ist.Tmp.tmp); vex_printf( " = " ); ppIRExpr(s->Ist.Tmp.data); break; case Ist_Store: vex_printf( "ST%s(", s->Ist.Store.end==Iend_LE ? "le" : "be" ); ppIRExpr(s->Ist.Store.addr); vex_printf( ") = "); ppIRExpr(s->Ist.Store.data); break; case Ist_Dirty: ppIRDirty(s->Ist.Dirty.details); break; case Ist_MFence: vex_printf("IR-MFence"); break; case Ist_Exit: vex_printf( "if (" ); ppIRExpr(s->Ist.Exit.guard); vex_printf( ") goto {"); ppIRJumpKind(s->Ist.Exit.jk); vex_printf("} "); ppIRConst(s->Ist.Exit.dst); break; default: vpanic("ppIRStmt"); }}void ppIRTypeEnv ( IRTypeEnv* env ) { UInt i; for (i = 0; i < env->types_used; i++) { if (i % 8 == 0) vex_printf( " "); ppIRTemp(i); vex_printf( ":"); ppIRType(env->types[i]); if (i % 8 == 7) vex_printf( "\n"); else vex_printf( " "); } if (env->types_used > 0 && env->types_used % 8 != 7) vex_printf( "\n"); }void ppIRBB ( IRBB* bb ){ Int i; vex_printf("IRBB {\n"); ppIRTypeEnv(bb->tyenv); vex_printf("\n"); for (i = 0; i < bb->stmts_used; i++) { vex_printf( " "); ppIRStmt(bb->stmts[i]); vex_printf( "\n"); } vex_printf( " goto {"); ppIRJumpKind(bb->jumpkind); vex_printf( "} "); ppIRExpr( bb->next ); vex_printf( "\n}\n");}/*---------------------------------------------------------------*//*--- Constructors ---*//*---------------------------------------------------------------*//* Constructors -- IRConst */IRConst* IRConst_U1 ( Bool bit ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_U1; c->Ico.U1 = bit; /* call me paranoid; I don't care :-) */ vassert(bit == False || bit == True); return c;}IRConst* IRConst_U8 ( UChar u8 ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_U8; c->Ico.U8 = u8; return c;}IRConst* IRConst_U16 ( UShort u16 ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_U16; c->Ico.U16 = u16; return c;}IRConst* IRConst_U32 ( UInt u32 ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_U32; c->Ico.U32 = u32; return c;}IRConst* IRConst_U64 ( ULong u64 ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_U64; c->Ico.U64 = u64; return c;}IRConst* IRConst_F64 ( Double f64 ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_F64; c->Ico.F64 = f64; return c;}IRConst* IRConst_F64i ( ULong f64i ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_F64i; c->Ico.F64i = f64i; return c;}IRConst* IRConst_V128 ( UShort con ){ IRConst* c = LibVEX_Alloc(sizeof(IRConst)); c->tag = Ico_V128; c->Ico.V128 = con; return c;}/* Constructors -- IRCallee */IRCallee* mkIRCallee ( Int regparms, HChar* name, void* addr ){ IRCallee* ce = LibVEX_Alloc(sizeof(IRCallee)); ce->regparms = regparms; ce->name = name; ce->addr = addr; ce->mcx_mask = 0; vassert(regparms >= 0 && regparms <= 3); vassert(name != NULL); vassert(addr != 0); return ce;}/* Constructors -- IRArray */IRArray* mkIRArray ( Int base, IRType elemTy, Int nElems ){ IRArray* arr = LibVEX_Alloc(sizeof(IRArray)); arr->base = base; arr->elemTy = elemTy; arr->nElems = nElems; vassert(!(arr->base < 0 || arr->base > 10000 /* somewhat arbitrary */)); vassert(!(arr->elemTy == Ity_I1)); vassert(!(arr->nElems <= 0 || arr->nElems > 500 /* somewhat arbitrary */)); return arr;}/* Constructors -- IRExpr */IRExpr* IRExpr_Binder ( Int binder ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Binder; e->Iex.Binder.binder = binder; return e;}IRExpr* IRExpr_Get ( Int off, IRType ty ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Get; e->Iex.Get.offset = off; e->Iex.Get.ty = ty; return e;}IRExpr* IRExpr_GetI ( IRArray* descr, IRExpr* ix, Int bias ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_GetI; e->Iex.GetI.descr = descr; e->Iex.GetI.ix = ix; e->Iex.GetI.bias = bias; return e;}IRExpr* IRExpr_Tmp ( IRTemp tmp ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Tmp; e->Iex.Tmp.tmp = tmp; return e;}IRExpr* IRExpr_Qop ( IROp op, IRExpr* arg1, IRExpr* arg2, IRExpr* arg3, IRExpr* arg4 ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Qop; e->Iex.Qop.op = op; e->Iex.Qop.arg1 = arg1; e->Iex.Qop.arg2 = arg2; e->Iex.Qop.arg3 = arg3; e->Iex.Qop.arg4 = arg4; return e;}IRExpr* IRExpr_Triop ( IROp op, IRExpr* arg1, IRExpr* arg2, IRExpr* arg3 ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Triop; e->Iex.Triop.op = op; e->Iex.Triop.arg1 = arg1; e->Iex.Triop.arg2 = arg2; e->Iex.Triop.arg3 = arg3; return e;}IRExpr* IRExpr_Binop ( IROp op, IRExpr* arg1, IRExpr* arg2 ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Binop; e->Iex.Binop.op = op; e->Iex.Binop.arg1 = arg1; e->Iex.Binop.arg2 = arg2; return e;}IRExpr* IRExpr_Unop ( IROp op, IRExpr* arg ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Unop; e->Iex.Unop.op = op; e->Iex.Unop.arg = arg; return e;}IRExpr* IRExpr_Load ( IREndness end, IRType ty, IRExpr* addr ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Load; e->Iex.Load.end = end; e->Iex.Load.ty = ty; e->Iex.Load.addr = addr; vassert(end == Iend_LE || end == Iend_BE); return e;}IRExpr* IRExpr_Const ( IRConst* con ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Const; e->Iex.Const.con = con; return e;}IRExpr* IRExpr_CCall ( IRCallee* cee, IRType retty, IRExpr** args ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_CCall; e->Iex.CCall.cee = cee; e->Iex.CCall.retty = retty; e->Iex.CCall.args = args; return e;}IRExpr* IRExpr_Mux0X ( IRExpr* cond, IRExpr* expr0, IRExpr* exprX ) { IRExpr* e = LibVEX_Alloc(sizeof(IRExpr)); e->tag = Iex_Mux0X; e->Iex.Mux0X.cond = cond; e->Iex.Mux0X.expr0 = expr0; e->Iex.Mux0X.exprX = exprX; return e;}/* Constructors for NULL-terminated IRExpr expression vectors, suitable for use as arg lists in clean/dirty helper calls. */IRExpr** mkIRExprVec_0 ( void ) { IRExpr** vec = LibVEX_Alloc(1 * sizeof(IRExpr*)); vec[0] = NULL; return vec;}IRExpr** mkIRExprVec_1 ( IRExpr* arg1 ) { IRExpr** vec = LibVEX_Alloc(2 * sizeof(IRExpr*)); vec[0] = arg1; vec[1] = NULL; return vec;}IRExpr** mkIRExprVec_2 ( IRExpr* arg1, IRExpr* arg2 ) { IRExpr** vec = LibVEX_Alloc(3 * sizeof(IRExpr*)); vec[0] = arg1; vec[1] = arg2; vec[2] = NULL; return vec;}IRExpr** mkIRExprVec_3 ( IRExpr* arg1, IRExpr* arg2, IRExpr* arg3 ) { IRExpr** vec = LibVEX_Alloc(4 * sizeof(IRExpr*)); vec[0] = arg1; vec[1] = arg2; vec[2] = arg3; vec[3] = NULL; return vec;}IRExpr** mkIRExprVec_4 ( IRExpr* arg1, IRExpr* arg2, IRExpr* arg3, IRExpr* arg4 ) { IRExpr** vec = LibVEX_Alloc(5 * sizeof(IRExpr*)); vec[0] = arg1; vec[1] = arg2; vec[2] = arg3; vec[3] = arg4; vec[4] = NULL; return vec;}IRExpr** mkIRExprVec_5 ( IRExpr* arg1, IRExpr* arg2, IRExpr* arg3, IRExpr* arg4, IRExpr* arg5 ) { IRExpr** vec = LibVEX_Alloc(6 * sizeof(IRExpr*)); vec[0] = arg1; vec[1] = arg2; vec[2] = arg3; vec[3] = arg4; vec[4] = arg5; vec[5] = NULL; return vec;}/* Constructors -- IRDirty */IRDirty* emptyIRDirty ( void ) { IRDirty* d = LibVEX_Alloc(sizeof(IRDirty)); d->cee = NULL; d->guard = NULL; d->args = NULL; d->tmp = IRTemp_INVALID; d->mFx = Ifx_None; d->mAddr = NULL; d->mSize = 0; d->needsBBP = False; d->nFxState = 0; return d;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -