From: Julian Seward Date: Sat, 26 Mar 2005 21:55:21 +0000 (+0000) Subject: Pay attention to the annotations on dirty helper calls, since they X-Git-Tag: svn/VALGRIND_3_0_0~867 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=31c2511ecd77ef58cf064409f70593d0a362edcd;p=thirdparty%2Fvalgrind.git Pay attention to the annotations on dirty helper calls, since they they tell us about the memory transactions done by such calls. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3451 --- diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c index 4e625fd8aa..f98d323ed7 100644 --- a/cachegrind/cg_main.c +++ b/cachegrind/cg_main.c @@ -390,6 +390,8 @@ void handleOneStatement(IRTypeEnv* tyenv, IRBB* bbOut, IRStmt* st, IRExpr** loadAddrExpr, IRExpr** storeAddrExpr, UInt* dataSize) { + tl_assert(isFlatIRStmt(st)); + switch (st->tag) { case Ist_NoOp: break; @@ -436,10 +438,29 @@ void handleOneStatement(IRTypeEnv* tyenv, IRBB* bbOut, IRStmt* st, break; } + case Ist_Dirty: { + IRDirty* d = st->Ist.Dirty.details; + if (d->mFx != Ifx_None) { + /* This dirty helper accesses memory. Collect the + details. */ + tl_assert(d->mAddr != NULL); + tl_assert(d->mSize != 0); + *dataSize = d->mSize; + if (d->mFx == Ifx_Read || d->mFx == Ifx_Modify) + *loadAddrExpr = d->mAddr; + if (d->mFx == Ifx_Write || d->mFx == Ifx_Modify) + *storeAddrExpr = d->mAddr; + } else { + tl_assert(d->mAddr == NULL); + tl_assert(d->mSize == 0); + } + addStmtToIRBB( bbOut, st ); + break; + } + case Ist_Put: case Ist_PutI: case Ist_Exit: - case Ist_Dirty: case Ist_MFence: addStmtToIRBB( bbOut, st ); break;