summaryrefslogtreecommitdiff
path: root/src/base/loader/symtab.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2016-06-20 14:39:48 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2016-06-20 14:39:48 +0100
commit60fb5e79f358b7d0784e4cfae4df9ec196e47f19 (patch)
tree898306efa0d556951bb59001f50418836ed715c7 /src/base/loader/symtab.cc
parentbb9033c26b6a84f4593c020a8078101e17a7b124 (diff)
downloadgem5-60fb5e79f358b7d0784e4cfae4df9ec196e47f19.tar.xz
base: Fix multiple names to one address bug in SymbolTable
The SymbolTable class currently assumes that at most one symbol can point to a given address. If multiple symbols point to the same address, only the first one gets added to the internal symbol table since there is already a match in the address table. This changeset converts the address table from a map into a multimap to be able to handle cases where an address maps to multiple symbols. Additionally, the insert method is changed to not fail if there is a match in the address table. Change-Id: I6b4f1d5560c21e49a4af33220efb2a8302961768 Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-by: Andreas Hansson <andreas.hansson@arm.com> Reviewed-by: Gabor Dozsa <gabor.dozsa@arm.com>
Diffstat (limited to 'src/base/loader/symtab.cc')
-rw-r--r--src/base/loader/symtab.cc7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/base/loader/symtab.cc b/src/base/loader/symtab.cc
index 439394852..853d98cc4 100644
--- a/src/base/loader/symtab.cc
+++ b/src/base/loader/symtab.cc
@@ -56,12 +56,13 @@ SymbolTable::insert(Addr address, string symbol)
if (symbol.empty())
return false;
- if (!addrTable.insert(make_pair(address, symbol)).second)
- return false;
-
if (!symbolTable.insert(make_pair(symbol, address)).second)
return false;
+ // There can be multiple symbols for the same address, so always
+ // update the addrTable multimap when we see a new symbol name.
+ addrTable.insert(make_pair(address, symbol));
+
return true;
}