mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-20 14:29:27 +00:00
[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:
parent
a77376dae1
commit
b6564648a5
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user