summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/loader/symtab.cc52
-rw-r--r--base/loader/symtab.hh9
-rw-r--r--sim/system.cc8
3 files changed, 63 insertions, 6 deletions
diff --git a/base/loader/symtab.cc b/base/loader/symtab.cc
index e4590ac62..25f54f9bf 100644
--- a/base/loader/symtab.cc
+++ b/base/loader/symtab.cc
@@ -31,18 +31,29 @@
#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);
+ }
+}
diff --git a/base/loader/symtab.hh b/base/loader/symtab.hh
index dce3c978e..324fd8b45 100644
--- a/base/loader/symtab.hh
+++ b/base/loader/symtab.hh
@@ -29,9 +29,12 @@
#ifndef __SYMTAB_HH__
#define __SYMTAB_HH__
+#include <iosfwd>
#include <map>
+
#include "targetarch/isa_traits.hh" // for Addr
+class Checkpoint;
class SymbolTable
{
public:
@@ -61,6 +64,7 @@ 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);
@@ -68,6 +72,11 @@ class SymbolTable
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
{
diff --git a/sim/system.cc b/sim/system.cc
index e67cae333..c91d7f142 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -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