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>
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;
}
class SymbolTable
{
public:
- typedef std::map<Addr, std::string> ATable;
+ typedef std::multimap<Addr, std::string> ATable;
typedef std::map<std::string, Addr> STable;
private:
if (i == addrTable.end())
return false;
+ // There are potentially multiple symbols that map to the same
+ // address. For simplicity, just return the first one.
symbol = (*i).second;
return true;
}