diff options
author | Ron Dreslinski <rdreslin@umich.edu> | 2004-11-17 09:54:38 -0500 |
---|---|---|
committer | Ron Dreslinski <rdreslin@umich.edu> | 2004-11-17 09:54:38 -0500 |
commit | f9ff53241f607e87d903f0d6b956db8d4cfab14b (patch) | |
tree | a2122d7583153e3bbcc47435cbd5319ef9189d0f /base | |
parent | ec636ed43f3bb96b5413214948372661519e296c (diff) | |
parent | 7da367d5ddba0cd72fbd351de3479c90b9e91b8c (diff) | |
download | gem5-f9ff53241f607e87d903f0d6b956db8d4cfab14b.tar.xz |
Merge zizzer:/z/m5/Bitkeeper/m5
into zazzer.eecs.umich.edu:/z/rdreslin/m5bk/clean
--HG--
extra : convert_revision : a64b84993c8852b19b1572c6913bf3dc6f6fc249
Diffstat (limited to 'base')
-rw-r--r-- | base/callback.hh | 7 | ||||
-rw-r--r-- | base/inet.hh | 4 | ||||
-rw-r--r-- | base/loader/symtab.cc | 44 | ||||
-rw-r--r-- | base/loader/symtab.hh | 31 |
4 files changed, 46 insertions, 40 deletions
diff --git a/base/callback.hh b/base/callback.hh index 342ab7e0f..cc2a2f429 100644 --- a/base/callback.hh +++ b/base/callback.hh @@ -32,7 +32,7 @@ #include <list> /** - * Generic callback class. This base class provides a virutal process + * Generic callback class. This base class provides a virtual process * function that gets called when the callback queue is processed. */ class Callback @@ -103,6 +103,8 @@ class CallbackQueue } }; +/// Helper template class to turn a simple class member function into +/// a callback. template <class T, void (T::* F)()> class MakeCallback : public Callback { @@ -111,8 +113,9 @@ class MakeCallback : public Callback public: MakeCallback(T *o) - : object(o) + : object(o) { } + void process() { (object->*F)(); } }; diff --git a/base/inet.hh b/base/inet.hh index 10b782a6c..4f3857a15 100644 --- a/base/inet.hh +++ b/base/inet.hh @@ -348,9 +348,9 @@ struct UdpHdr : public udp_hdr uint16_t sport() const { return ntohs(uh_sport); } uint16_t dport() const { return ntohs(uh_dport); } uint16_t len() const { return ntohs(uh_ulen); } - uint16_t sum() const { return ntohs(uh_sum); } + uint16_t sum() const { return uh_sum; } - void sum(uint16_t sum) { uh_sum = htons(sum); } + void sum(uint16_t sum) { uh_sum = sum; } int size() const { return sizeof(udp_hdr); } const uint8_t *bytes() const { return (const uint8_t *)this; } diff --git a/base/loader/symtab.cc b/base/loader/symtab.cc index f6abf7e3d..2a29a8575 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; } @@ -140,19 +136,3 @@ SymbolTable::findAddress(const string &symbol, Addr &address) const address = (*i).second; return true; } - -string -SymbolTable::find(Addr addr) const -{ - string s; - findSymbol(addr, s); - return s; -} - -Addr -SymbolTable::find(const string &symbol) const -{ - Addr a = 0; - findAddress(symbol, a); - return a; -} diff --git a/base/loader/symtab.hh b/base/loader/symtab.hh index 48230c7a2..5ae29b057 100644 --- a/base/loader/symtab.hh +++ b/base/loader/symtab.hh @@ -49,12 +49,35 @@ class SymbolTable bool insert(Addr address, std::string symbol); bool load(const std::string &file); - bool findNearestSymbol(Addr address, std::string &symbol) const; + /// Find the nearest symbol equal to or less than the supplied + /// address (e.g., the label for the enclosing function). + /// @param address The address to look up. + /// @param symbol Return reference for symbol string. + /// @param sym_address Return reference for symbol address. + /// @param next_sym_address Address of following symbol (for + /// determining valid range of symbol). + /// @retval True if a symbol was found. + bool findNearestSymbol(Addr address, std::string &symbol, + Addr &sym_address, Addr &next_sym_address) const; + + /// Overload for findNearestSymbol() for callers who don't care + /// about next_sym_address. + bool findNearestSymbol(Addr address, std::string &symbol, + Addr &sym_address) const + { + Addr dummy; + return findNearestSymbol(address, symbol, sym_address, dummy); + } + + bool findSymbol(Addr address, std::string &symbol) const; bool findAddress(const std::string &symbol, Addr &address) const; - - std::string find(Addr addr) const; - Addr find(const std::string &symbol) const; }; +/// Global unified debugging symbol table (for target). Conceptually +/// there should be one of these per System object for full system, +/// and per Process object for non-full-system, but so far one big +/// global one has worked well enough. +extern SymbolTable *debugSymbolTable; + #endif // __SYMTAB_HH__ |