diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2004-11-15 01:56:40 -0500 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2004-11-15 01:56:40 -0500 |
commit | fed64a3b3634315bce420b2bc63312c1fa62bb8f (patch) | |
tree | fa45a0e8c3154c7e1e27e393198fd1e2ad1cd5fb /base/loader/symtab.cc | |
parent | 2e0695ec9ae9bbc798c8164e9dd66f59fef93b4e (diff) | |
download | gem5-fed64a3b3634315bce420b2bc63312c1fa62bb8f.tar.xz |
Add support for sampled PC profiling to FullCPU.
Simple text list of symbol (or address) and count
will be dumped to m5prof.<cpu-name> if the cpu's
pc_sample_interval param is set.
SConscript:
Add cpu/full_cpu/pc_sample_profile.cc
base/callback.hh:
Add a comment about MakeCallback.
Fix type in another comment.
base/loader/symtab.cc:
Revamp findNearestSymbol() to provide addresses of both
nearest symbols (preceding and following) as well as
string for former.
Move global definition of debugSymbolTable here too.
base/loader/symtab.hh:
Revamp findNearestSymbol() to provide addresses of both
nearest symbols (preceding and following) as well as
string for former.
Move global declaration of debugSymbolTable here too.
cpu/exetrace.cc:
Use new findNearestSymbol() interface for trace symbols.
kern/linux/linux_system.cc:
sim/system.cc:
Remove extern of debugSymbolTable (now in symtab.hh)
sim/process.cc:
Initialize debugSymbolTable if binary has a symbol table.
--HG--
extra : convert_revision : 0b5393dc39c40ac88c953684708f1125da550671
Diffstat (limited to 'base/loader/symtab.cc')
-rw-r--r-- | base/loader/symtab.cc | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/base/loader/symtab.cc b/base/loader/symtab.cc index f6abf7e3d..c018ae4f8 100644 --- a/base/loader/symtab.cc +++ b/base/loader/symtab.cc @@ -38,6 +38,8 @@ using namespace std; +SymbolTable *debugSymbolTable = NULL; + bool SymbolTable::insert(Addr address, string symbol) { @@ -95,26 +97,20 @@ SymbolTable::load(const string &filename) } bool -SymbolTable::findNearestSymbol(Addr address, string &symbol) const +SymbolTable::findNearestSymbol(Addr address, string &symbol, + Addr &sym_address, Addr &next_sym_address) const { - ATable::const_iterator i = addrTable.lower_bound(address); - - // check for PALCode - if (address & 0x1) - return false; + // find first key *larger* than desired address + ATable::const_iterator i = addrTable.upper_bound(address); - // first check for the end - if (i == addrTable.end()) - i--; - else if (i == addrTable.begin() && (*i).first != address) + // if very first key is larger, we're out of luck + if (i == addrTable.begin()) return false; - else if ((*i).first != address) - i--; - - symbol = (*i).second; - if (address != (*i).first) - symbol += csprintf("+%d", address - (*i).first); + next_sym_address = i->first; + --i; + sym_address = i->first; + symbol = i->second; return true; } |