gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
symtab.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002-2005 The Regents of The University of Michigan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Authors: Nathan Binkert
29  */
30 
31 #include "base/loader/symtab.hh"
32 
33 #include <fstream>
34 #include <iostream>
35 #include <string>
36 #include <vector>
37 
38 #include "base/misc.hh"
39 #include "base/str.hh"
40 #include "base/types.hh"
41 #include "sim/serialize.hh"
42 
43 using namespace std;
44 
46 
47 void
49 {
50  addrTable.clear();
51  symbolTable.clear();
52 }
53 
54 bool
55 SymbolTable::insert(Addr address, string symbol)
56 {
57  if (symbol.empty())
58  return false;
59 
60  if (!symbolTable.insert(make_pair(symbol, address)).second)
61  return false;
62 
63  // There can be multiple symbols for the same address, so always
64  // update the addrTable multimap when we see a new symbol name.
65  addrTable.insert(make_pair(address, symbol));
66 
67  return true;
68 }
69 
70 
71 bool
72 SymbolTable::load(const string &filename)
73 {
74  string buffer;
75  ifstream file(filename.c_str());
76 
77  if (!file)
78  fatal("file error: Can't open symbol table file %s\n", filename);
79 
80  while (!file.eof()) {
81  getline(file, buffer);
82  if (buffer.empty())
83  continue;
84 
85  string::size_type idx = buffer.find(',');
86  if (idx == string::npos)
87  return false;
88 
89  string address = buffer.substr(0, idx);
90  eat_white(address);
91  if (address.empty())
92  return false;
93 
94  string symbol = buffer.substr(idx + 1);
95  eat_white(symbol);
96  if (symbol.empty())
97  return false;
98 
99  Addr addr;
100  if (!to_number(address, addr))
101  return false;
102 
103  if (!insert(addr, symbol))
104  return false;
105  }
106 
107  file.close();
108 
109  return true;
110 }
111 
112 void
113 SymbolTable::serialize(const string &base, CheckpointOut &cp) const
114 {
115  paramOut(cp, base + ".size", addrTable.size());
116 
117  int i = 0;
118  ATable::const_iterator p, end = addrTable.end();
119  for (p = addrTable.begin(); p != end; ++p) {
120  paramOut(cp, csprintf("%s.addr_%d", base, i), p->first);
121  paramOut(cp, csprintf("%s.symbol_%d", base, i), p->second);
122  ++i;
123  }
124 }
125 
126 void
128 {
129  clear();
130  int size;
131  paramIn(cp, base + ".size", size);
132  for (int i = 0; i < size; ++i) {
133  Addr addr;
134  std::string symbol;
135 
136  paramIn(cp, csprintf("%s.addr_%d", base, i), addr);
137  paramIn(cp, csprintf("%s.symbol_%d", base, i), symbol);
138  insert(addr, symbol);
139  }
140 }
Bitfield< 7 > i
Definition: miscregs.hh:1378
ip6_addr_t addr
Definition: inet.hh:335
SymbolTable * debugSymbolTable
Global unified debugging symbol table (for target).
Definition: symtab.cc:45
void clear()
Definition: symtab.cc:48
unsigned int size_type
Definition: types.hh:56
bool load(const std::string &file)
Definition: symtab.cc:72
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
void serialize(const std::string &base, CheckpointOut &cp) const
Definition: symtab.cc:113
void paramOut(CheckpointOut &cp, const string &name, ExtMachInst const &machInst)
Definition: types.cc:40
Bitfield< 51, 12 > base
Definition: pagetable.hh:85
#define fatal(...)
Definition: misc.hh:163
bool insert(Addr address, std::string symbol)
Definition: symtab.cc:55
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
int size()
Definition: pagetable.hh:146
std::ostream CheckpointOut
Definition: serialize.hh:67
void eat_white(std::string &s)
Definition: str.hh:61
void paramIn(CheckpointIn &cp, const string &name, ExtMachInst &machInst)
Definition: types.cc:71
void unserialize(const std::string &base, CheckpointIn &cp)
Definition: symtab.cc:127
Bitfield< 0 > p
bool to_number(const std::string &value, Pixel &retval)
Definition: framebuffer.hh:216

Generated on Fri Jun 9 2017 13:03:41 for gem5 by doxygen 1.8.6