diff options
-rw-r--r-- | src/base/fast_alloc.cc | 59 | ||||
-rw-r--r-- | src/base/fast_alloc.hh | 6 | ||||
-rwxr-xr-x | util/rundiff | 4 |
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(); } |