[llvm-symbolizer] rewrite r183213 in a more clear way

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183526 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov 2013-06-07 15:25:27 +00:00
parent a77376dae1
commit b6564648a5
2 changed files with 10 additions and 7 deletions

View File

@ -64,7 +64,8 @@ ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
SymbolAddress == UnknownAddressOrSize) SymbolAddress == UnknownAddressOrSize)
continue; continue;
uint64_t SymbolSize; 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)) if (isa<MachOObjectFile>(Obj))
SymbolSize = 0; SymbolSize = 0;
else if (error(si->getSize(SymbolSize)) || 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 // FIXME: If a function has alias, there are two entries in symbol table
// with same address size. Make sure we choose the correct one. // with same address size. Make sure we choose the correct one.
SymbolMapTy &M = SymbolType == SymbolRef::ST_Function ? Functions : Objects; SymbolMapTy &M = SymbolType == SymbolRef::ST_Function ? Functions : Objects;
SymbolDesc SD = { SymbolAddress, SymbolAddress + SymbolSize }; SymbolDesc SD = { SymbolAddress, SymbolSize };
M.insert(std::make_pair(SD, SymbolName)); M.insert(std::make_pair(SD, SymbolName));
} }
} }
@ -89,14 +90,14 @@ bool ModuleInfo::getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address,
return false; return false;
SymbolDesc SD = { Address, Address }; SymbolDesc SD = { Address, Address };
SymbolMapTy::const_iterator it = M.upper_bound(SD); SymbolMapTy::const_iterator it = M.upper_bound(SD);
if (it == M.begin())
return false;
--it; --it;
// Assume that symbols with zero size are large enough. if (it->first.Size != 0 && it->first.Addr + it->first.Size <= Address)
if (it->first.Addr < it->first.AddrEnd &&
it->first.AddrEnd <= Address)
return false; return false;
Name = it->second.str(); Name = it->second.str();
Addr = it->first.Addr; Addr = it->first.Addr;
Size = it->first.AddrEnd - it->first.Addr; Size = it->first.Size;
return true; return true;
} }

View File

@ -82,7 +82,9 @@ private:
struct SymbolDesc { struct SymbolDesc {
uint64_t Addr; 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) { friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
return s1.Addr < s2.Addr; return s1.Addr < s2.Addr;
} }