FastAlloc: track allocation tick in debug mode,
authorSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 8 Jan 2009 22:13:33 +0000 (14:13 -0800)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 8 Jan 2009 22:13:33 +0000 (14:13 -0800)
 minor enhancements to debug output

src/base/fast_alloc.cc
src/base/fast_alloc.hh

index a91a99d20a53373d6aa9821c39071c3b556e5a1e..0238f03cbc7eef9a0f4cdbb4a4a13432699dec94 100644 (file)
@@ -75,12 +75,13 @@ FastAlloc::moreStructs(int bucket)
 
 #if FAST_ALLOC_DEBUG
 
-#include <iomanip>
-#include <iostream>
 #include <map>
 #include <string>
 #include <typeinfo>
 
+#include "base/cprintf.hh"
+#include "sim/core.hh"   // for curTick
+
 using namespace std;
 
 // count of in-use FastAlloc objects
@@ -103,6 +104,7 @@ FastAlloc::FastAlloc()
 {
     // mark this object in use
     inUse = true;
+    whenAllocated = curTick;
 
     // update count
     ++numInUse;
@@ -131,6 +133,13 @@ FastAlloc::~FastAlloc()
     inUseNext->inUsePrev = inUsePrev;
 }
 
+
+// Note that in all the display functions below we suppress anything
+// with a zero allocation timestamp... there are a bunch of static or
+// quasi-static structures that get allocated during initialization
+// and we generally don't care about them so this gets them out of the
+// way.
+
 // summarize in-use list
 void
 FastAlloc::dump_summary()
@@ -139,17 +148,19 @@ FastAlloc::dump_summary()
 
     for (FastAlloc *p = inUseHead.inUseNext; p != &inUseHead; p = p->inUseNext)
     {
-        ++typemap[typeid(*p).name()];
+        if (p->whenAllocated != 0)
+            ++typemap[typeid(*p).name()];
     }
 
     map<string, int>::const_iterator mapiter;
 
-    cout << " count  type\n"
-         << " -----  ----\n";
+    cprintf(" count  type\n"
+            " -----  ----\n");
     for (mapiter = typemap.begin(); mapiter != typemap.end(); ++mapiter)
-        cout << setw(6) << mapiter->second << "  " << mapiter->first << endl;
+        cprintf("%6d  %s\n",mapiter->second, mapiter->first);
 }
 
+
 // show oldest n items on in-use list
 void
 FastAlloc::dump_oldest(int n)
@@ -157,17 +168,45 @@ FastAlloc::dump_oldest(int n)
     // sanity check: don't want to crash the debugger if you forget to
     // pass in a parameter
     if (n < 0 || n > numInUse) {
-        cout << "FastAlloc::dump_oldest: bad arg " << n
-             << " (" << numInUse << " objects in use" << endl;
+        cprintf("FastAlloc::dump_oldest: bad arg %d (%d objects in use)\n",
+                n, numInUse);
+        return;
+    }
+
+    for (FastAlloc *p = inUseHead.inUseNext;
+         p != &inUseHead && n > 0;
+         p = p->inUseNext, --n) {
+        if (p->whenAllocated != 0)
+            cprintf("%x %15d %s\n", p, p->whenAllocated, typeid(*p).name());
+    }
+}
+
+
+// show oldest n items on in-use list for specified type
+void
+FastAlloc::dump_oldest_of_type(int n, const char *type_name)
+{
+    // sanity check: don't want to crash the debugger if you forget to
+    // pass in a parameter
+    if (n < 0 || n > numInUse) {
+        cprintf("FastAlloc::dump_oldest_of_type: bad arg %d "
+                "(%d objects in use)\n",
+                n, numInUse);
         return;
     }
 
     for (FastAlloc *p = inUseHead.inUseNext;
          p != &inUseHead && n > 0;
-         p = p->inUseNext, --n)
-        cout << p << " " << typeid(*p).name() << endl;
+         p = p->inUseNext) {
+        if (p->whenAllocated != 0 &&
+            strcmp(typeid(*p).name(), type_name) == 0) {
+            cprintf("%x %15d\n", p, p->whenAllocated);
+            --n;
+        }
+    }
 }
 
+
 //
 // C interfaces to FastAlloc::dump_summary() and FastAlloc::dump_oldest().
 // gdb seems to have trouble with calling C++ functions directly.
index 775c93d50a8ff1337ea6df0552acb96af8e1ffe0..c6490174ed63b3cbf80e7b4bc028b692258a1bb7 100644 (file)
@@ -74,6 +74,10 @@ class FastAlloc
 
 #else
 
+#if FAST_ALLOC_DEBUG
+#include "sim/host.hh"   // for Tick
+#endif
+
 class FastAlloc
 {
   public:
@@ -127,6 +131,7 @@ class FastAlloc
     bool inUse;                 // in-use flag
     FastAlloc *inUsePrev;       // ptrs to build list of in-use objects
     FastAlloc *inUseNext;
+    Tick whenAllocated;
 
     // static (global) debugging vars
     static int numInUse;        // count in-use objects
@@ -137,6 +142,7 @@ class FastAlloc
     // versions that might be more agreeable to call from gdb)
     static void dump_summary();
     static void dump_oldest(int n);
+    static void dump_oldest_of_type(int n, const char *type_name);
 #endif
 };