From: Julian Seward Date: Thu, 8 Jul 2004 01:46:01 +0000 (+0000) Subject: More stuff. X-Git-Tag: svn/VALGRIND_3_0_1^2~1270 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=decd9d2442e794ec925d50ac035ebb50161e71e7;p=thirdparty%2Fvalgrind.git More stuff. git-svn-id: svn://svn.valgrind.org/vex/trunk@64 --- diff --git a/VEX/priv/ir/ir_defs.c b/VEX/priv/ir/ir_defs.c index c6fc2558d1..35d94090ed 100644 --- a/VEX/priv/ir/ir_defs.c +++ b/VEX/priv/ir/ir_defs.c @@ -41,7 +41,10 @@ void ppIRConst ( IRConst* con ) void ppIRTemp ( IRTemp tmp ) { - vex_printf( "t%d", tmp); + if (tmp == INVALID_IRTEMP) + vex_printf("INVALID_IRTEMP"); + else + vex_printf( "t%d", tmp); } @@ -67,7 +70,9 @@ void ppIRExpr ( IRExpr* e ) { switch (e->tag) { case Iex_Get: - vex_printf( "GET(%d,%d)", e->Iex.Get.offset, e->Iex.Get.size); + vex_printf( "GET(%d,", e->Iex.Get.offset); + ppIRType(e->Iex.Get.ty); + vex_printf(")"); break; case Iex_Tmp: ppIRTemp(e->Iex.Tmp.tmp); @@ -105,7 +110,7 @@ void ppIRStmt ( IRStmt* s ) { switch (s->tag) { case Ist_Put: - vex_printf( "PUT(%d,%d) = ", s->Ist.Put.offset, s->Ist.Put.size); + vex_printf( "PUT(%d) = ", s->Ist.Put.offset); ppIRExpr(s->Ist.Put.expr); break; case Ist_Tmp: @@ -220,11 +225,11 @@ IRConst* IRConst_U64 ( ULong u64 ) /* Constructors -- IRExpr */ -IRExpr* IRExpr_Get ( Int off, Int sz ) { +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.size = sz; + e->Iex.Get.ty = ty; return e; } IRExpr* IRExpr_Tmp ( IRTemp tmp ) { @@ -265,12 +270,11 @@ IRExpr* IRExpr_Const ( IRConst* con ) { /* Constructors -- IRStmt */ -IRStmt* IRStmt_Put ( Int off, Int sz, IRExpr* value ) { +IRStmt* IRStmt_Put ( Int off, IRExpr* value ) { IRStmt* s = LibVEX_Alloc(sizeof(IRStmt)); s->tag = Ist_Put; s->link = NULL; s->Ist.Put.offset = off; - s->Ist.Put.size = sz; s->Ist.Put.expr = value; return s; } @@ -364,6 +368,8 @@ IRType lookupIRTypeEnv ( IRTypeEnv* env, IRTemp tmp ) IRType typeOfIRExpr ( IRTypeEnv* tyenv, IRExpr* e ) { switch (e->tag) { + case Iex_Get: + return e->Iex.Get.ty; case Iex_Tmp: return lookupIRTypeEnv(tyenv, e->Iex.Tmp.tmp); case Iex_Const: diff --git a/VEX/priv/main/vex_main.c b/VEX/priv/main/vex_main.c index edd3fcf099..52b4537cb9 100644 --- a/VEX/priv/main/vex_main.c +++ b/VEX/priv/main/vex_main.c @@ -94,6 +94,7 @@ TranslateResult LibVEX_Translate ( IRBB* irbb; HInstrArray* vcode; HInstrArray* rcode; + Int i; vassert(vex_initdone); LibVEX_Clear(False); @@ -145,6 +146,13 @@ TranslateResult LibVEX_Translate ( /* Turn it into virtual-registerised code. */ vcode = iselBB ( irbb ); + vex_printf("\n-------- Virtual registerised code --------\n"); + for (i = 0; i < vcode->arr_used; i++) { + ppInstr(vcode->arr[i]); + vex_printf("\n"); + } + vex_printf("\n"); + /* Register allocate. */ rcode = doRegisterAllocation ( vcode, available_real_regs, n_available_real_regs, @@ -152,6 +160,13 @@ TranslateResult LibVEX_Translate ( genSpill, genReload, ppInstr, ppReg ); + vex_printf("\n-------- Post-regalloc code --------\n"); + for (i = 0; i < rcode->arr_used; i++) { + ppInstr(rcode->arr[i]); + vex_printf("\n"); + } + vex_printf("\n"); + /* Assemble, etc. */ LibVEX_Clear(True); diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index 12d84d1fa9..3a6e604585 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -53,10 +53,12 @@ extern void ppIRConst ( IRConst* ); /* ------------------ Temporaries ------------------ */ -typedef Int IRTemp; +typedef UInt IRTemp; extern void ppIRTemp ( IRTemp ); +#define INVALID_IRTEMP ((IRTemp)0xFFFFFFFF) + /* ------------------ Binary and unary ops ------------------ */ @@ -98,8 +100,8 @@ typedef IRExprTag tag; union { struct { - Int offset; - Int size; + Int offset; + IRType ty; } Get; struct { IRTemp tmp; @@ -124,7 +126,7 @@ typedef } IRExpr; -extern IRExpr* IRExpr_Get ( Int off, Int sz ); +extern IRExpr* IRExpr_Get ( Int off, IRType ty ); extern IRExpr* IRExpr_Tmp ( IRTemp tmp ); extern IRExpr* IRExpr_Binop ( IROp op, IRExpr* arg1, IRExpr* arg2 ); extern IRExpr* IRExpr_Unop ( IROp op, IRExpr* arg ); @@ -151,7 +153,6 @@ typedef union { struct { Int offset; - Int size; IRExpr* expr; } Put; struct { @@ -167,7 +168,7 @@ typedef } IRStmt; -extern IRStmt* IRStmt_Put ( Int off, Int sz, IRExpr* value ); +extern IRStmt* IRStmt_Put ( Int off, IRExpr* value ); extern IRStmt* IRStmt_Tmp ( IRTemp tmp, IRExpr* expr ); extern IRStmt* IRStmt_STle ( IRExpr* addr, IRExpr* value ); diff --git a/VEX/test_main.c b/VEX/test_main.c index 95e1717b8b..568333db7f 100644 --- a/VEX/test_main.c +++ b/VEX/test_main.c @@ -78,7 +78,8 @@ int main ( int argc, char** argv ) assert(linebuf[0] == '.'); /* second line is: . byte byte byte etc */ //printf("%s", linebuf); - printf("Basic Block %d, Start %x, nbytes %d\n", + printf("\n\n============ Basic Block %d, " + "Start %x, nbytes %d ============\n\n", bb_number, orig_addr, orig_nbytes); assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF); for (i = 0; i < orig_nbytes; i++) { @@ -250,8 +251,8 @@ int main ( void ) printf("\nAfter\n"); for (i = 0; i < rcode->arr_used; i++) { - ppX86Instr(stdout, rcode->arr[i]); - printf("\n"); + ppX86Instr(stdout, rcode->arr[i]); + printf("\n"); } printf("\n"); }