[llvm-symbolizer] rewrite r183213 in a more clear way
authorAlexey Samsonov <samsonov@google.com>
Fri, 7 Jun 2013 15:25:27 +0000 (15:25 +0000)
committerAlexey Samsonov <samsonov@google.com>
Fri, 7 Jun 2013 15:25:27 +0000 (15:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183526 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-symbolizer/LLVMSymbolize.cpp
tools/llvm-symbolizer/LLVMSymbolize.h

index fcbc84e0c0fd2c6422e741af7ba5c38e195dba9c..7fccedf1c4e004d6a47daf1b1c7e4877d1d3d976 100644 (file)
@@ -64,7 +64,8 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
         SymbolAddress == UnknownAddressOrSize)
       continue;
     uint64_t SymbolSize;
-    // Getting symbol size is linear for Mach-O files, so avoid it.
+    // Getting symbol size is linear for Mach-O files, so assume that symbol
+    // occupies the memory range up to the following symbol.
     if (isa<MachOObjectFile>(Obj))
       SymbolSize = 0;
     else if (error(si->getSize(SymbolSize)) ||
@@ -76,7 +77,7 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
     // FIXME: If a function has alias, there are two entries in symbol table
     // with same address size. Make sure we choose the correct one.
     SymbolMapTy &M = SymbolType == SymbolRef::ST_Function ? Functions : Objects;
-    SymbolDesc SD = { SymbolAddress, SymbolAddress + SymbolSize };
+    SymbolDesc SD = { SymbolAddress, SymbolSize };
     M.insert(std::make_pair(SD, SymbolName));
   }
 }
@@ -89,14 +90,14 @@ bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
     return false;
   SymbolDesc SD = { Address, Address };
   SymbolMapTy::const_iterator it = M.upper_bound(SD);
+  if (it == M.begin())
+    return false;
   --it;
-  // Assume that symbols with zero size are large enough.
-  if (it->first.Addr < it->first.AddrEnd &&
-      it->first.AddrEnd <= Address)
+  if (it->first.Size != 0 && it->first.Addr + it->first.Size <= Address)
     return false;
   Name = it->second.str();
   Addr = it->first.Addr;
-  Size = it->first.AddrEnd - it->first.Addr;
+  Size = it->first.Size;
   return true;
 }
 
index e35bdf916fccadef257e6d695327b8bdbed0d49f..188331bfa67ec7cbd8d64bdfd5ac996da833e019 100644 (file)
@@ -82,7 +82,9 @@ private:
 
   struct SymbolDesc {
     uint64_t Addr;
-    uint64_t AddrEnd;
+    // If size is 0, assume that symbol occupies the whole memory range up to
+    // the following symbol.
+    uint64_t Size;
     friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
       return s1.Addr < s2.Addr;
     }