Serialize the symbol tables
authorNathan Binkert <binkertn@umich.edu>
Sun, 20 Nov 2005 23:42:12 +0000 (18:42 -0500)
committerNathan Binkert <binkertn@umich.edu>
Sun, 20 Nov 2005 23:42:12 +0000 (18:42 -0500)
base/loader/symtab.cc:
    Add support for clearing out the symbol table
    Add support for serializing the symbol table (clear on unserialize)
    Don't allow empty symbols to be entered into the table
base/loader/symtab.hh:
    Add support for clearing out the symbol table
    Add support for serializing the symbol table
sim/system.cc:
    Serialize the kernel, console, and palcode symbol tables so that
    we can capture any dynamic symbols that are added and so that we
    don't have to have the same kernel binary around to get the
    symbols right

--HG--
extra : convert_revision : 779888c88aa530f3adcd37dc7600a335951d05f7

base/loader/symtab.cc
base/loader/symtab.hh
sim/system.cc

index e4590ac621742e7d52a4021067c6fd34780d51af..25f54f9bf1627d7e8f45471c12cb9cb0ab43d008 100644 (file)
 #include <string>
 #include <vector>
 
-#include "sim/host.hh"
+#include "base/loader/symtab.hh"
 #include "base/misc.hh"
 #include "base/str.hh"
-#include "base/loader/symtab.hh"
+#include "sim/host.hh"
+#include "sim/serialize.hh"
 
 using namespace std;
 
 SymbolTable *debugSymbolTable = NULL;
 
+void
+SymbolTable::clear()
+{
+    addrTable.clear();
+    symbolTable.clear();
+}
+
 bool
 SymbolTable::insert(Addr address, string symbol)
 {
+    if (symbol.empty())
+        return false;
+
     if (!addrTable.insert(make_pair(address, symbol)).second)
         return false;
 
@@ -59,10 +70,8 @@ SymbolTable::load(const string &filename)
     string buffer;
     ifstream file(filename.c_str());
 
-    if (!file) {
-        cerr << "Can't open symbol table file " << filename << endl;
-        fatal("file error");
-    }
+    if (!file)
+        fatal("file error: Can't open symbol table file %s\n", filename);
 
     while (!file.eof()) {
         getline(file, buffer);
@@ -95,3 +104,34 @@ SymbolTable::load(const string &filename)
 
     return true;
 }
+
+void
+SymbolTable::serialize(const string &base, ostream &os)
+{
+    paramOut(os, base + ".size", addrTable.size());
+
+    int i = 0;
+    ATable::const_iterator p, end = addrTable.end();
+    for (p = addrTable.begin(); p != end; ++p) {
+        paramOut(os, csprintf("%s.addr_%d", base, i), p->first);
+        paramOut(os, csprintf("%s.symbol_%d", base, i), p->second);
+        ++i;
+    }
+}
+
+void
+SymbolTable::unserialize(const string &base, Checkpoint *cp,
+                         const string &section)
+{
+    clear();
+    int size;
+    paramIn(cp, section, base + ".size", size);
+    for (int i = 0; i < size; ++i) {
+        Addr addr;
+        std::string symbol;
+
+        paramIn(cp, section, csprintf("%s.addr_%d", base, i), addr);
+        paramIn(cp, section, csprintf("%s.symbol_%d", base, i), symbol);
+        insert(addr, symbol);
+    }
+}
index dce3c978ef00f90100bb267931d1bd419ab881d9..324fd8b45742b04593ecfd28df03624bdb2079e6 100644 (file)
 #ifndef __SYMTAB_HH__
 #define __SYMTAB_HH__
 
+#include <iosfwd>
 #include <map>
+
 #include "targetarch/isa_traits.hh"    // for Addr
 
+class Checkpoint;
 class SymbolTable
 {
   public:
@@ -61,12 +64,18 @@ class SymbolTable
     SymbolTable(const std::string &file) { load(file); }
     ~SymbolTable() {}
 
+    void clear();
     bool insert(Addr address, std::string symbol);
     bool load(const std::string &file);
 
     const ATable &getAddrTable() const { return addrTable; }
     const STable &getSymbolTable() const { return symbolTable; }
 
+  public:
+    void serialize(const std::string &base, std::ostream &os);
+    void unserialize(const std::string &base, Checkpoint *cp,
+                     const std::string &section);
+
   public:
     bool
     findSymbol(Addr address, std::string &symbol) const
index e67cae3338dd27e85263ff6be5cc4b533efc4f49..c91d7f1421e34f49ce061b2557b2d186a3711685 100644 (file)
@@ -333,6 +333,10 @@ void
 System::serialize(ostream &os)
 {
     kernelBinning->serialize(os);
+
+    kernelSymtab->serialize("kernel_symtab", os);
+    consoleSymtab->serialize("console_symtab", os);
+    palSymtab->serialize("pal_symtab", os);
 }
 
 
@@ -340,6 +344,10 @@ void
 System::unserialize(Checkpoint *cp, const string &section)
 {
     kernelBinning->unserialize(cp, section);
+
+    kernelSymtab->unserialize("kernel_symtab", cp, section);
+    consoleSymtab->unserialize("console_symtab", cp, section);
+    palSymtab->unserialize("pal_symtab", cp, section);
 }
 
 void