]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Pay attention to the annotations on dirty helper calls, since they
authorJulian Seward <jseward@acm.org>
Sat, 26 Mar 2005 21:55:21 +0000 (21:55 +0000)
committerJulian Seward <jseward@acm.org>
Sat, 26 Mar 2005 21:55:21 +0000 (21:55 +0000)
they tell us about the memory transactions done by such calls.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3451

cachegrind/cg_main.c

index 4e625fd8aaf0eb5a1ff42306c83b7903e3099744..f98d323ed71c9acab4846f10a75a27bafe2a2ac7 100644 (file)
@@ -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;