From c370a9cb9884f54a54450c9073555ed53ecdbacc Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Thu, 8 Jan 2009 14:13:33 -0800 Subject: [PATCH] FastAlloc: track allocation tick in debug mode, minor enhancements to debug output --- src/base/fast_alloc.cc | 59 +++++++++++++++++++++++++++++++++++------- src/base/fast_alloc.hh | 6 +++++ 2 files changed, 55 insertions(+), 10 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 -#include #include #include #include +#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::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) - cout << p << " " << typeid(*p).name() << endl; + 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) { + 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 };