summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/fast_alloc.cc59
-rw-r--r--src/base/fast_alloc.hh6
-rwxr-xr-xutil/rundiff4
3 files changed, 58 insertions, 11 deletions
diff --git a/src/base/fast_alloc.cc b/src/base/fast_alloc.cc
index a91a99d20..0238f03cb 100644
--- a/src/base/fast_alloc.cc
+++ b/src/base/fast_alloc.cc
@@ -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.
diff --git a/src/base/fast_alloc.hh b/src/base/fast_alloc.hh
index 775c93d50..c6490174e 100644
--- a/src/base/fast_alloc.hh
+++ b/src/base/fast_alloc.hh
@@ -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
};
diff --git a/util/rundiff b/util/rundiff
index c34bb53a3..cd2527e54 100755
--- a/util/rundiff
+++ b/util/rundiff
@@ -43,7 +43,7 @@
#
use strict;
-
+use FileHandle;
use Getopt::Std;
#
@@ -165,6 +165,8 @@ sub printdiff
# Set $postcontext to print the next $postcontext_lines matching lines.
$postcontext = $postcontext_lines;
+
+ STDOUT->flush();
}