base: Fix multiple names to one address bug in SymbolTable
authorAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 20 Jun 2016 13:39:48 +0000 (14:39 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 20 Jun 2016 13:39:48 +0000 (14:39 +0100)
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>
src/base/loader/symtab.cc
src/base/loader/symtab.hh

index 439394852daaa405ed40bd032755b9efabe9d197..853d98cc434bb3a0beb22d8c4b1c0d8b3a4efd71 100644 (file)
@@ -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;
 }
 
index 403cb13ac0237185a8650bef52fc1bde7a2be608..bd0406b749253a4cc6ab3f6f093d3ac586eec37a 100644 (file)
@@ -42,7 +42,7 @@
 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:
@@ -87,6 +87,8 @@ class SymbolTable
         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;
     }