gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
symtab.hh
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 
29 #ifndef __SYMTAB_HH__
30 #define __SYMTAB_HH__
31 
32 #include <functional>
33 #include <iosfwd>
34 #include <map>
35 #include <memory>
36 #include <string>
37 #include <vector>
38 
39 #include "base/trace.hh"
40 #include "base/types.hh"
41 #include "sim/serialize.hh"
42 
43 namespace Loader
44 {
45 
46 struct Symbol
47 {
48  enum class Binding {
49  Global,
50  Local,
51  Weak
52  };
53 
55  std::string name;
57 };
58 
60 {
61  public:
62  typedef std::shared_ptr<SymbolTable> SymbolTablePtr;
63 
64  private:
66  // Map addresses to an index into the symbol vector.
67  typedef std::multimap<Addr, int> AddrMap;
68  // Map a symbol name to an index into the symbol vector.
69  typedef std::map<std::string, int> NameMap;
70 
71  SymbolVector symbols;
72  AddrMap addrMap;
73  NameMap nameMap;
74 
75  bool
76  upperBound(Addr addr, AddrMap::const_iterator &iter) const
77  {
78  // find first key *larger* than desired address
79  iter = addrMap.upper_bound(addr);
80 
81  // if very first key is larger, we're out of luck
82  if (iter == addrMap.begin())
83  return false;
84 
85  return true;
86  }
87 
88  typedef std::function<void(SymbolTable &symtab,
89  const Symbol &symbol)> SymTabOp;
91  operate(SymTabOp op) const
92  {
93  SymbolTablePtr symtab(new SymbolTable);
94  for (const auto &symbol: symbols)
95  op(*symtab, symbol);
96  return symtab;
97  }
98 
99  typedef std::function<bool(const Symbol &symbol)> SymTabFilter;
101  filter(SymTabFilter filter) const
102  {
103  SymTabOp apply_filter =
104  [filter](SymbolTable &symtab, const Symbol &symbol) {
105  if (filter(symbol)) {
106  symtab.insert(symbol);
107  }
108  };
109  return operate(apply_filter);
110  }
111 
114  {
115  auto filt = [binding](const Symbol &symbol) {
116  return symbol.binding == binding;
117  };
118  return filter(filt);
119  }
120 
121  public:
122  typedef SymbolVector::iterator iterator;
123  typedef SymbolVector::const_iterator const_iterator;
124 
125  const_iterator begin() const { return symbols.begin(); }
126  const_iterator end() const { return symbols.end(); }
127 
128  void clear();
129  // Insert either a single symbol or the contents of an entire symbol table
130  // into this one.
131  bool insert(const Symbol &symbol);
132  bool insert(const SymbolTable &other);
133  bool load(const std::string &file);
134  bool empty() const { return symbols.empty(); }
135 
137  offset(Addr by) const
138  {
139  SymTabOp op = [by](SymbolTable &symtab, const Symbol &symbol) {
140  Symbol sym = symbol;
141  sym.address += by;
142  symtab.insert(sym);
143  };
144  return operate(op);
145  }
146 
148  mask(Addr m) const
149  {
150  SymTabOp op = [m](SymbolTable &symtab, const Symbol &symbol) {
151  Symbol sym = symbol;
152  sym.address &= m;
153  symtab.insert(sym);
154  };
155  return operate(op);
156  }
157 
159  globals() const
160  {
161  return filterByBinding(Symbol::Binding::Global);
162  }
163 
165  locals() const
166  {
167  return filterByBinding(Symbol::Binding::Local);
168  }
169 
171  weaks() const
172  {
173  return filterByBinding(Symbol::Binding::Weak);
174  }
175 
176  void serialize(const std::string &base, CheckpointOut &cp) const;
177  void unserialize(const std::string &base, CheckpointIn &cp,
178  Symbol::Binding default_binding=Symbol::Binding::Global);
179 
180  const_iterator
182  {
183  AddrMap::const_iterator i = addrMap.find(address);
184  if (i == addrMap.end())
185  return end();
186 
187  // There are potentially multiple symbols that map to the same
188  // address. For simplicity, just return the first one.
189  return symbols.begin() + i->second;
190  }
191 
192  const_iterator
193  find(const std::string &name) const
194  {
195  NameMap::const_iterator i = nameMap.find(name);
196  if (i == nameMap.end())
197  return end();
198 
199  return symbols.begin() + i->second;
200  }
201 
208  const_iterator
209  findNearest(Addr addr, Addr &nextaddr) const
210  {
211  AddrMap::const_iterator i = addrMap.end();
212  if (!upperBound(addr, i))
213  return end();
214 
215  nextaddr = i->first;
216  --i;
217  return symbols.begin() + i->second;
218  }
219 
222  const_iterator
224  {
225  AddrMap::const_iterator i = addrMap.end();
226  if (!upperBound(addr, i))
227  return end();
228 
229  --i;
230  return symbols.begin() + i->second;
231  }
232 };
233 
239 
240 } // namespace Loader
241 
242 #endif // __SYMTAB_HH__
std::vector< Symbol > SymbolVector
Definition: symtab.hh:65
Bitfield< 7 > i
Bitfield< 0 > m
const_iterator find(const std::string &name) const
Definition: symtab.hh:193
const_iterator findNearest(Addr addr, Addr &nextaddr) const
Find the nearest symbol equal to or less than the supplied address (e.g., the label for the enclosing...
Definition: symtab.hh:209
bool upperBound(Addr addr, AddrMap::const_iterator &iter) const
Definition: symtab.hh:76
Addr address
Definition: symtab.hh:56
ip6_addr_t addr
Definition: inet.hh:330
SymbolTablePtr globals() const
Definition: symtab.hh:159
SymbolTable debugSymbolTable
Global unified debugging symbol table (for target).
Definition: symtab.cc:47
const_iterator end() const
Definition: symtab.hh:126
SymbolTablePtr locals() const
Definition: symtab.hh:165
Definition: cprintf.cc:40
SymbolTablePtr weaks() const
Definition: symtab.hh:171
SymbolVector::iterator iterator
Definition: symtab.hh:122
std::map< std::string, int > NameMap
Definition: symtab.hh:69
SymbolTablePtr offset(Addr by) const
Definition: symtab.hh:137
SymbolTablePtr operate(SymTabOp op) const
Definition: symtab.hh:91
bool empty() const
Definition: symtab.hh:134
const_iterator begin() const
Definition: symtab.hh:125
Bitfield< 51, 12 > base
Definition: pagetable.hh:141
bool insert(const Symbol &symbol)
Definition: symtab.cc:58
SymbolTablePtr mask(Addr m) const
Definition: symtab.hh:148
void serialize(const ThreadContext &tc, CheckpointOut &cp)
Thread context serialization helpers.
SymbolTablePtr filter(SymTabFilter filter) const
Definition: symtab.hh:101
std::function< bool(const Symbol &symbol)> SymTabFilter
Definition: symtab.hh:99
SymbolVector symbols
Definition: symtab.hh:71
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:140
NameMapType & nameMap()
Definition: statistics.cc:149
std::function< void(SymbolTable &symtab, const Symbol &symbol)> SymTabOp
Definition: symtab.hh:89
std::shared_ptr< SymbolTable > SymbolTablePtr
Definition: symtab.hh:62
SymbolVector::const_iterator const_iterator
Definition: symtab.hh:123
std::ostream CheckpointOut
Definition: serialize.hh:63
const_iterator find(Addr address) const
Definition: symtab.hh:181
const_iterator findNearest(Addr addr) const
Overload for findNearestSymbol() for callers who don&#39;t care about nextaddr.
Definition: symtab.hh:223
Binding binding
Definition: symtab.hh:54
void unserialize(ThreadContext &tc, CheckpointIn &cp)
NameMap nameMap
Definition: symtab.hh:73
SymbolTablePtr filterByBinding(Symbol::Binding binding) const
Definition: symtab.hh:113
Bitfield< 4 > op
Definition: types.hh:78
std::multimap< Addr, int > AddrMap
Definition: symtab.hh:67
std::string name
Definition: symtab.hh:55
AddrMap addrMap
Definition: symtab.hh:72

Generated on Mon Jun 8 2020 15:45:07 for gem5 by doxygen 1.8.13