mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +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:
		| @@ -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; | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user